2011-08-04 30 views
1

我在Linux下編寫一個接口,它從TCP套接字獲取數據。用戶提供一個緩衝區,其中存儲接收的數據。如果提供的Buffer很小,我只想返回一個錯誤。首先問題是確定緩衝區是否很小。 recv()函數只是返回實際寫入緩衝區的字節數。如果我使用recv()手冊頁中聲明的MSG_TRUNC標誌,它仍會返回相同的結果。第二個問題是丟棄仍然在套接字中排隊的數據。所以,如果我確定我提供的Buffer很小,我只想擦除套接字上留下的所有內容。除了關閉並重新打開套接字或只是接收到沒有剩下任何東西之外,是否還有其他方法可以這樣做?最好的問候<確定是否有數據留在套接字上並丟棄它

一個建議是隻是recv,直到沒有剩餘(我得到返回0) - 但不會因爲每次我打電話給這個預設超時(在這種情況下,它是5秒? recv它等待數據還是超時?

+0

免責聲明/解釋位是不必要的。只是問你的問題。 – vezult

+0

請你能提供原帖的鏈接嗎? – jweyrich

回答

4

在TCP級沒有關於構成應用協議消息的知識。有,但是,最常見的兩種方式TCP流劃定消息:發現

  • 前綴郵件及其大小和讀取的字節數,或者
  • 讀,直到字節一定的順序。

在該光中,通用TCP讀者應該提供兩個讀取功能是普遍有用:

  • 讀取N個字節,並
  • 讀取直到分隔符已經被讀取

類似於Tornado IOStream閱讀功能的設計可以。

1

您的設計存在缺陷。

如果客戶端提供的緩衝區太小,您如何知道丟棄了多少數據?數據中是否有某些信息告訴您何時已達到要丟棄的消息末尾?如果是這種情況,那麼您需要在代碼中緩衝輸入流,以便可以檢測這些邊界。如果您的代碼將流視爲未區分的字節,那麼您的問題沒有意義,因爲您的代碼原則上不知道何時停止丟棄數據。對於TCP流,除非有一個嵌入式協議來分隔「消息」,否則在連接關閉之前它是全有或全無的。

相關問題