2012-03-16 67 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