Отправка данных сокетов с ведущим значением длины - PullRequest
4 голосов
/ 16 марта 2012

Я хочу отправлять сообщения JSON из скрипта PHP в приложение C # по сетевому соединению, используя PHP Sockets .

Обычно для двоичных протоколов первые 4 байта каждого сообщения должны быть целым числом, которое представляет длину (сколько байтов) сообщения.

В C # я добавляю к каждому сообщению целое число, которое сообщает длину сообщения следующим образом:

byte[] msgBytes = UTF8Encoding.UTF8.GetBytes("A JSON msg");            
byte[] prefixBytes = BitConverter.GetBytes(msgBytes.Length);
byte[] msgToSend = new byte[prefixBytes.Length + msgBytes.Length];
Buffer.BlockCopy(prefixBytes, 0, msgToSend, 0, prefixBytes.Length);
Buffer.BlockCopy(msgBytes, 0, msgToSend, prefixBytes.Length, msgBytes.Length);

Как я понимаю, в PHP функция socket_send принимает только строки. Итак, как я могу сделать такой же префикс в PHP 5.x?

Обновление: Я опубликовал дополнительный вопрос о том, как обрабатывать такие префиксные данные при получении из сетевого сокета.

Ответы [ 2 ]

5 голосов
/ 16 марта 2012

Полагаю, вы могли бы использовать pack () для преобразования количества байтов в двоичную строку. Когда вы отправляете свои данные по сети, вам, вероятно, необходимо выполнить преобразование в формате «N» (длинный без знака, всегда 32-битный, порядок байтов с прямым порядком байтов).

Вот пример:

$s="Hello World";
$length=pack("N",strlen($s));
socket_send($sock,$length.$s,4+strlen($s));
5 голосов
/ 16 марта 2012

В PHP строки являются двоичными.

Таким образом, вам необходимо закодировать целочисленное значение длины как двоичное представление целого числа со знаком n un в виде строки из 4 символов (4 октета; 32 бита). См pack:

# choose the right format according to your byte-order needs:

l   signed long (always 32 bit, machine byte order)
L   unsigned long (always 32 bit, machine byte order)
N   unsigned long (always 32 bit, big endian byte order)
V   unsigned long (always 32 bit, little endian byte order)

$string = pack('l', $length);
...