ado
Новичок
Отправка пакетов данных через сокет
Есть задача отправлять неик пакеты данных на сервер.
Для этого создаю сединение через сокет и просто через send посылаю пакет.
Но возникает след проблема:
если в пакет создать таким образом:
то на сервер приходит бинарный пакет, т.е. php правильно интерпретирует \x в двойных кавычках как 16-ричное число.
Но если пакет создать таким образом:
то данные в $_data1 и $_data2 интерпретируются как строковые, и пакет получается состоящим из заголовка в виде бинарных данных и идущей далее строки, соответственно сервер такой пакет бракует.
Как можно создать пакет, чтобы в него подставлялись заранее неизвестные данные($_data1 и $_data2, напримерый пришедшие постом) и интерпретировались php как 16-ричные данные, а не как строка.
Есть задача отправлять неик пакеты данных на сервер.
Для этого создаю сединение через сокет и просто через send посылаю пакет.
Но возникает след проблема:
если в пакет создать таким образом:
PHP:
$data = "\xf1\x00\x40\x02\x32\x33\x34\x35\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x32\x33\x34\x35\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
Но если пакет создать таким образом:
PHP:
$_data1 = asc2hex("12345", 30);
$_data2 = asc2hex("12345", 30);
$data = "\xf1\x00\x40\x02" . $_data1 . $_data2;
function asc2hex ($str, $need_length = 0, $byte = '00') {
$data = '';
$adding_data = '';
$length = strlen($str);
$length = max($length, $need_length);
for ($i=0; $i<$length; $i++) {
if(substr($str, $i, 1)) {
//$data .= sprintf("\x%02x", ord(substr($str, $i, 1)));//это тоже работает
//$data .= "\x".preg_replace('#(.*)#e', 'dechex(ord("$1"))', substr($str, $i, 1));//и это тоже работает
$data .= "\x".dechex(ord(substr($str, $i, 1)));// но это проще всего
} else {
$data .= "\x$byte";
}
}
return $data;
}
то данные в $_data1 и $_data2 интерпретируются как строковые, и пакет получается состоящим из заголовка в виде бинарных данных и идущей далее строки, соответственно сервер такой пакет бракует.
Как можно создать пакет, чтобы в него подставлялись заранее неизвестные данные($_data1 и $_data2, напримерый пришедшие постом) и интерпретировались php как 16-ричные данные, а не как строка.