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

Mik*_*ike 8 php sockets asyncsocket php-5.3

据我了解,可以在PHP 5.x中创建一个非阻塞网络套接字.

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

socket_write($socket, $string1, $length);
socket_write($socket, $string2, $length);
socket_write($socket, $string3, $length);
socket_write($socket, $string4, $length);
Run Code Online (Sandbox Code Playgroud)

这些消息是否排队(在发送方/接收方?)或接收方是否可能因为发送"并行"而获取不同消息的一部分?

例如:接收器是否有可能获得10个字节的$ string1,然后30个字节的$ string2,然后是另外25个字节的$ string1 ......依此类推......

Jus*_*ier 6

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

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

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

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

  • @Mike:请记住,这有点特定于PHP.如果您启动多线程(PHP不支持,但其他人,如C或Java),您必须在套接字上实现互斥(锁)以防止接收器端出现这种奇怪的,意外的行为. (3认同)
  • 这意味着对于我上面的例子:TCP套接字将保证接收器永远不会看到来自$ string2,3或4的数据,直到完全收到$ string1为止? (2认同)
  • 是的,但请记住,所有数据都写到同一个套接字,因此接收方会将数据视为单个信息流.除非您在数据中添加字符串长度,分隔符或其他信息,否则接收方将不知道`$ string1`的结束位置和`$ string2`的开始位置. (2认同)
  • @netcoder这是一个重要的信息,因为我还将创建ac#socket应用程序.这意味着,我必须锁定发送套接字,直到发送完整的数据?如果是这样的话:为什么不只是使用阻塞套接字? (2认同)