Неблокирующие сокеты: стоят ли сообщения в очереди? - PullRequest
8 голосов
/ 16 марта 2012

Как я понимаю, в PHP 5.x можно создать неблокирующую сеть сокет .

Но что произойдет, если скрипт отправит несколько длинных сообщений, используя один и тот же неблокирующий сокет, как указано ниже:

socket_write($socket, $string1, $length);
socket_write($socket, $string2, $length);
socket_write($socket, $string3, $length);
socket_write($socket, $string4, $length);

Эти сообщения поставлены в очередь (на стороне отправителя / получателя?) Или это возможночто получатель получает части разных сообщений, потому что они отправили «параллельно»?

Например: возможно ли, чтобы получатель получил 10 байтов $ string1, затем 30 байтов $ string2, затем еще 25 байтов $строка1 ... и тд ....

1 Ответ

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

Это зависит от протокола, который использует сокет.См. socket_create для возможных типов сокетов.Основными типами являются UDP и TCP:

udp Протокол пользовательских дейтаграмм - это протокол без установления соединения, ненадежный, с фиксированной длиной записи.Из-за этих аспектов UDP требует минимального количества служебных данных протокола.

tcp Протокол управления передачей - это надежный, основанный на соединении, ориентированный на поток, дуплексный протокол.TCP гарантирует, что все пакеты данных будут получены в том порядке, в котором они были отправлены.Если какой-либо пакет будет каким-либо образом потерян во время связи, TCP будет автоматически повторно передавать пакет, пока узел назначения не подтвердит этот пакет.По причинам надежности и производительности реализация TCP сама определяет соответствующие границы октетов нижележащего уровня передачи дейтаграмм.Поэтому в приложениях TCP должна быть предусмотрена возможность частичной передачи записи.

Чтобы ответить на ваш вопрос напрямую, сокеты TCP будут гарантировать доставку по порядку, а сокеты UDP - нет.

...