2011-08-04 20 views
0

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

託比

回答

1

正如在手冊頁中,MSG_TRUNC僅適用於包套接字(如UDP),所以當你想爲你的TCP套接字這是基於流的,這將無法正常工作。在stackoverflow和其他地方,有數百篇文章談論保留TCP上的應用程序消息邊界(提示:你自己需要這樣做,TCP是一個字節流接口,不會),所以我不會詳細討論這裏的細節可以這麼說,您需要一種機制來了解recv()端應用程序「消息」或「數據包」的大小,以使您能夠通過TCP執行所需操作(或者您需要切換到UDP) 。

對於TCP,如果您需要「排空」套接字,直到沒有剩餘數據纔會工作,但是,您需要考慮上面提到的消息邊界,以便您不通過一條「消息「並開始進入下一個(再次,最重要的一點要記住的是,TCP提供了一個字節流接口,並不一定會保留您的應用級數據包或消息的概念)。

+0

根據[tcp(7)手冊頁](http://man7.org/linux/man-pages/man7/tcp.7.html):「自2.4版以來,Linux支持使用' 'recv(2)'(''recvmsg(2)''''flags'參數中的'MSG_TRUNC'。這個標誌使得接收到的數據字節被丟棄,而不是返回到調用者提供的緩衝區中。 2.4.4,'MSG_TRUNC'與'MSG_OOB'一起使用來接收帶外數據時也有這種效果。*「 –

相關問題