2012-01-15 108 views
10

什麼是「正常」關閉TCP套接字的推薦方式?我已經瞭解到,在read()之前關閉()ing主機緩衝區中的所有剩餘數據可能會導致遠程主機出現問題(他可能會丟失接收緩衝區中的所有數據,尚未被他的申請閱讀)。那是對的嗎?正確關閉TCP套接字

什麼是避免這種情況的好方法?有什麼方法可以告訴API,由於忽略了任何剩餘的緩衝數據並關閉了套接字,我並不在乎數據丟失嗎?

或者我是否必須在應用協議級別考慮問題,並使用某種隱式或顯式「傳輸結束」信號讓對方知道關閉套接字以便讀取是安全的?

+0

用什麼語言? – Kiril 2012-01-15 20:19:07

+0

伯克利插座;我使用C,但我對一般概念感興趣。 – lxgr 2012-01-15 20:23:44

回答

15

1)撥打shutdown表示您不會再向套接字寫入更多數據。

2)從套接字繼續到read,直到出現錯誤或連接關閉。

3)現在close的插座。

如果你不這樣做,你可能會關閉連接,但仍然有數據需要讀取。這將導致不公平的結局。

+0

好吧,我會那樣做的。出於好奇:我真的有可能忽略我的接收緩衝區中的數據,而不是主機發送的數據,因爲我的接收緩衝區中的數據會丟失,因此我發送到遠程主機的數據可能會丟失? – lxgr 2012-01-15 20:23:13

+1

是的,您發送*到遠程主機的數據可能會丟失,因爲在另一側讀取數據之前可能發生無端關閉。直到您確信連接已關閉,您纔想調用close。 – 2012-01-15 23:11:14

+3

1)shutdown(sock,1),2)while(read(sock,...)= 0)3)close(sock)是那個順序嗎? – ernesto 2014-02-06 06:48:37