2009-09-08 61 views
2

這屬於Linux內核2.6 TCP套接字。Linux TCP/IP針對套接字流的非阻塞發送...... TCP recv緩衝區會發生什麼情況?

我發送大量的數據,說300 MB,與非阻塞發送給誰一次接收8 MB的另一端。

一個8 MB的接收後,「接收器」停止接收,因爲它想執行其他任務,如錯誤處理。發送者會得到一個EWOULDBLOCK,但由於它是異步通信,發送者會嘗試填充另一端的TCP recv緩衝區。

我的問題是:將有仍然在TCP recv的緩衝數據,即使在「發件人」有一個EWOULDBLOCK和「接收器」停止接收?同一個套接字用於錯誤處理,那麼「接收方」必須在嘗試重用現有套接字之前清除TCP recv緩衝區?

回答

3

是的。當你得到EWOULDBLOCK時,你已經發送的一些數據還沒有被接收應用讀取,這是完全可能的(事實上可能)。這個緩衝數據將可用於套接字上的下一個read

這意味着如果你的接收者發送一個「Ooops,不要再發送」消息給發送者,發送者就不能對該消息採取行動並「解除」發送數據。一旦它傳遞到write()/send(),它已經開始並且不能被召回。

接收機將通過讀出它不再感興趣,並丟棄它的數據,這將意味着你將需要某種形式的交易分隔符的數據流來處理這種可能性。

+0

但它只會填滿TCP recv緩衝區,只有部分8 MB會被髮送。那麼你怎麼知道丟棄多少? – user224579 2009-09-08 02:22:07

+0

至少就你解釋你在做什麼而言,你是不會知道的。套接字只是數據流。它們的唯一含義是你在應用程序級別協議,記錄等方面對它們施加的影響。如果這是一個需要考慮的條件,那麼你需要定義一些能夠讓你解決的條件。 – Duck 2009-09-08 02:49:50

+0

我明白了,這是應用程序的責任。謝謝! – user224579 2009-09-08 02:59:31

0

我的問題是:即使「發件人」得到EWOULDBLOCK並且「接收器」停止接收,TCP recv緩衝區中是否仍有數據?

有一個在TCP數據接收緩衝區因爲發件人得到EWOULDBLOCK。這是它可能發生的唯一條件。

你的問題沒有意義。

相關問題