2011-06-13 251 views
4

我有一個客戶端和一臺服務器通過標準TCP連接相互通信。TCP - 發送和接收TCP/IP數據

服務器被配置爲以x字節的大小一致的塊發送數據。客戶端還被配置爲以x字節爲單位接收數據(即,除非與遠程端的連接失敗,否則客戶端期望對TCP棧接收x字節的調用將成功。

以上面的假設爲基礎建立基於TCP的協議是否可行?

回答

3

似曾相識Will TCPStream read block until all data is received.

我知道這看起來有點不同,但在覈心它們是非常類似的問題。

不要對數據包大小做出假設。

+0

我不確定對這個問題的回答是否完整。撇開「恰當的形式」。 TCP對可靠性和流量控制有嚴格的規定。如果發送方在「一次打擊」中發送20個字節,那麼肯定不應允許接收方讀取這20個字節中的任何一個字符,直到所有字節都按照正確的順序接收和重構爲止?和;因此,基於預先協商的塊大小的協議合同應該可以承擔,如果不合適? – S73417H 2011-06-13 03:39:24

+0

不是。這是一條小溪。我可能會寫100個字節,可能會翻譯成100個1字節的讀取。或2個50字節的讀取。或者任何其他組合。它不是基於分組的。請參閱[this](http://www.codeproject.com/KB/IP/socketmessageboundary.aspx)以獲取更多討論。 – ribram 2011-06-13 03:45:08

+0

同樣的文章陳述如下: 「解決TCP消息問題最容易但成本最高的方法是創建一個始終傳輸固定大小消息的協議,通過將所有消息設置爲相同大小,接收TCP程序可以毫無疑問地知道從遠程設備收到了整個消息的時間。「 因此,假設數據包大小是確定的,只要通信雙方都遵守。記住我的協議不使用可變長度的數據塊 - 它總是一樣的。 – S73417H 2011-06-13 03:47:16

3

No. TCP是基於流的協議。除非您在應用程序級別處理自己的塊,否則不能保證「塊」。作爲協議的TCP不會爲你保證。