2012-03-29 68 views
0
  1. 在客戶端,它總是得到完全響應,或者有一半得到響應的機會,另一半得到另一種響應(例如:取決於緩衝區,我們爲recv()API定義)。
  2. 有沒有可能在recv()API中接收兩個填充響應。

回答

1

您可以從零到您請求的大小獲取任意數量的數據。始終檢查返回值以查看實際收到的數據量。

要回答您的問題:您可以獲得比完整的「回覆」更少的回報,或者您可以獲得比完整的「回覆」更多的回覆。如果您收到多條完整的回覆消息,您可能會得到兩個或一個半,或者其他不止一個。

3

TCP不保留消息邊界。它公開的是一個字節流。因此,您在一邊調用的send()可能不對應於另一邊的recv()。例如,下面可能會發生:

  • A調用發送(),具有100個字節,然後調用再次發送()有100個字節
  • B調用的recv(),並得到200個字節(見Nagle's algorithm

或者反過來說:

  • A調用send()方法1 MIB
  • B調用的recv(),獲得512昆明植物研究所,然後調用的recv()再次,得到512 KiB(緩衝區空間在接收方或發送方都不足)。

關於你提到的「填充」的問題,不是說你檢查的recv的返回值(),看看有多少字節,其中居然在緩衝區中返回。

0

可以形成傳遞給發送這樣的數據塊:[6個字節:數據大小的頭] [數據]

然後調用的recv()在迴路中讀取在每次迭代1個字節。讀取'數據大小頭'(前6個字節)並分配所需大小的緩衝區,然後讀取其餘字節。