Неблокирующие сокеты: сообщения в очереди?

Как я понимаю, можно создать nonblocking сеть гнездо в PHP 5.х.

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

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 байтов $string1 ... и так далее....

1 ответов


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

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

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

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