Intereting Posts
Списки каталогов и файлов PHP Загрузка изображения из базы данных Android в MySQL Можно ли удалить ActionScript из SWF-файла с помощью PHP? Как конкатенировать несколько тернарных операторов в PHP? Проверка формы Codeigniter Причины ошибки MySQL 2014 Не удается выполнить запросы, в то время как другие небуферизованные запросы активны Часовой пояс по умолчанию в Европе установлен в php.ini, но date_default_timezone_get () возвращает 'UTC' Является ли htmlspecialchars достаточным для предотвращения SQL-инъекции переменной, заключенной в одинарные кавычки? PHP, что лучше всего подходит для использования XML? Нужно создавать и анализировать ответы XML Как перенаправить или показать страницу, а не «Запрещено», когда у меня отключены списки каталогов (htaccess / unix) Как получить весь ключ в многомерном массиве в php fputcsv и коды новой строки Заголовки электронной почты php sys_get_temp_dir () – возвращает C: \ Windows на windows8 Проблемы с тайм-аутом Auth с CakePHP

Отправка данных сокетов с использованием значения ведущей длины

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

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

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

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?

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

    В PHP строки двоичные.

    Поэтому вам нужно закодировать значение целочисленной длины как двоичное представление n un signed integer в виде строки с 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); 

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

    Вот пример:

     $s="Hello World"; $length=pack("N",strlen($s)); socket_send($sock,$length.$s,4+strlen($s));