2013-05-03 109 views
3

在編寫Linux下C 一個tcp程序我想關閉TCP connectin 我用close(sockfd) 我注意到這個功能將啓動一個FIN/ACK包發送給其它同行 但如果其他同行不響應的ACK由於網絡問題或TCP sequnce號碼不一致的情況(例如:其他同行崩潰的TCP協議棧) 那麼似乎TCP連接無法關閉 它總是會在FIN_WAIT1狀態如果FIN/ACK沒有得到ACK響應,如何關閉tcp連接?

如何面對呢? 如何在這種情況下關閉tcp連接?

+0

然後關閉部分將再次嘗試發送'FIN',並再次多次,直到它最終超時並且'close'返回一個錯誤。 – 2013-05-03 12:31:46

+0

在我看來'close()'不在阻塞樣式中,所以錯誤在調用後不能被返回。如何獲得錯誤? – user1944267 2013-05-03 12:40:59

+0

@ user1944267套接字是阻塞的還是非阻塞的? – 2013-05-03 12:46:54

回答

-1

TCP處理它。你不必處理它。你無法處理它。

+0

**這實際上是錯誤的。**至少有兩種方法可以解決這個問題:通過調整TCP堆棧以使TCP會話更快超時或在應用程序級別使用'setsockopt()'與'SO_LINGER '。 **事實上錯誤的答案是您應該對它投票的原因。** – 2018-01-19 18:02:28

-1

默認情況下,TCP根據系統相關的系統配置參數由TCP實現進行透明處理。

這可以通過使用setsockopt()設置SO_LINGER套接字選項來覆蓋,在這種情況下,呼叫close()會阻塞,直到達到指定的超時時間。

編輯:我應該補充說,大多數時間使用SO_LINGER只是爲了增加一些錯誤處理的麻煩,比如記錄錯誤消息,指出可能有一些數據沒有被另一端收到。

+0

SO_LINGER與此無關。它導致'close()'被阻塞,直到掛起的數據和流出的FIN被刷新,*或*直到達到'setsockopt()'提供的*指定的超時值,而不是'配置的超時值'不需要FIN被確認。 – EJP 2018-01-19 11:07:02

+0

你是對的,我應該寫「指定」,而不是「配置」。但是......因爲這樣一個簡單的措詞問題,你已經低估了這個答案嗎?現在你應該知道,在這種情況下,每個答案下都有一個「編輯」鏈接。 **順便說一句,在我看來,不再等待ACK是OP想要做的。** – 2018-01-19 17:56:47

相關問題