2013-11-01 412 views
0

在linux中,如何確定TCP套接字的狀態? 我在這個主題中搜索了很多,但我沒有找到真正有用的解決方案。 我最追逐的說法是:將某些東西寫入套接字,如果連接關閉,它將失敗。 但是如果流的內容被綁定,並且a可能不會在流中寫入任何垃圾? 我另一方面netstat可以確定套接字狀態,但如果我想實施基於netstat的解決方案,它將是非常昂貴的。我必須將fileDescriptor解析爲socketID,而不是從/ proc/net/tcp中讀取所有記錄,找到擬合線和測試狀態。如果必須週期性地調用此方法,則效率不高。 這裏有一些其他的速記解決方案嗎?確定tcp連接狀態

回答

0

你不能。 TCP套接字不具有動態狀態;他們只有先前操作的結果。如果您不在TCP連接上運行,則故意設計爲不改變狀態。它沒有「撥號音」,這是它完全取代SNA這樣的網絡體系結構的根本原因。

0

您必須執行套接字I/O操作以確定連接是否仍然存在。如果你不能寫入套接字,你仍然可以嘗試一個讀取操作(只要它不影響其他讀操作)並查看它是否因連接錯誤而失敗。

+0

......牢記閱讀不會像寫作那樣暴露網絡問題。 – EJP

+0

寫作並不保證可以揭示它們。在套接字知道連接已斷開/丟失之前,它會高興地保持將出站數據接收到其內部緩衝區,直到最終填滿爲止,然後阻止調用者進一步寫入,直到最終檢測到斷開連接,從而導致寫入失敗。與閱讀相同的東西。當套接字的內部緩衝區爲空時,將不再有數據讀取,阻止調用者讀取,但最終套接字將檢測到斷開連接,導致讀取失敗。 –

+0

這不一樣。寫入強制堆棧發送數據,期待ACK,發送重試,操作重試定時器和計數器......所有這些都可能最終跳閘失敗。閱讀只讀。唯一的失敗條件是讀取超時,並且只能發送到應用程序,而不會在堆棧中導致任何永久性錯誤。 – EJP