2012-03-16 60 views
8

据我所知,有可能在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个字节的$字符串1,那么$字符串2 30个字节,然后又25个字节的字符串1 $ ...等等....

回答

6

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

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

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

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

+0

+1另请参阅http://stackoverflow.com/questions/1432477/can-php-asynchronously-use-sockets – msanford 2012-03-16 15:38:38

+2

这意味着对于我上面的示例:TCP套接字将保证接收器永远不会看到$ string2中的数据,3或4直到$ string1被完全接收? – Mike 2012-03-16 15:40:56

+2

是的,但请记住所有数据都写入同一个套接字,因此接收方将看到数据为单个信息流。除非给数据添加字符串长度,分隔符或其他信息,否则接收者将不知道“$ string1”结束和“$ string2”开始的位置。 – 2012-03-16 15:46:49