非阻塞套接字:消息是否排队?

时间:2012-03-16 15:09:27

标签: php sockets php-5.3 asyncsocket

据我了解,可以在PHP 5.x中创建nonblocking网络socket

但是如果脚本使用相同的非阻塞套接字发送几条长消息,会发生什么:

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 个答案:

答案 0 :(得分:6)

这取决于套接字正在使用的协议。有关可能的套接字类型,请参阅socket_create。主要类型是UDP和TCP:

  

udp 用户数据报协议是一种无连接,不可靠的协议,具有固定的记录长度。由于这些方面,UDP需要最少量的协议开销。

     

tcp 传输控制协议是一种可靠的,基于连接的,面向流的全双工协议。 TCP保证将按发送顺序接收所有数据包。如果任何数据包在通信过程中以某种方式丢失,TCP将自动重新传输数据包,直到目标主机确认该数据包。出于可靠性和性能原因,TCP实现本身决定了底层数据报通信层的适当八位字节边界。因此,TCP应用程序必须允许部分记录传输的可能性。

要直接回答您的问题,TCP套接字将保证按顺序传送,而UDP套接字则不会。