2015-05-21 47 views
0

我有一個在VxWorks上運行的TCP應用程序。我爲我的TCP連接設置了SO_KEEPALIVE選項。我的應用程序跟蹤所有的TCP連接並將其放入鏈接列表中。如何在應用程序中處理TCP keepalive

如果客戶端閒置很長時間,我們會看到連接正在關閉。連接未在netstat輸出中列出。

由於連接被TCP堆棧關閉,因此爲該連接分配的資源不會被清除。您能否幫我弄清楚,如果由於保持活動的故障導致連接關閉,應用程序如何得到通知。

回答

1

TCP保持活動主要是爲了防止網絡路由器,查封了TCP連接時長時間不活動,不以防止您的操作系統或應用程序從關閉連接在其認爲適當。

在大多數TCP/IP實現,你可以決定是否連接已經通過試圖從中讀取關閉。

+0

謝謝,是從關閉連接讀取/寫入可以提供幫助。我想了解這是否是最好的方法,或者還有其他方法。 –

+0

它可能取決於您正在使用的TCP/IP實現,但在我見過的大多數實現中,讀取(而不是寫入)是實現它的最佳方式。 –

+0

路由器如何關閉2個對等體之間的連接? –

0

從這個參考:http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

我引述:

這個過程是有用的,因爲如果其他同齡人失去他們的連接(例如,通過重新啓動),你會發現連接中斷,甚至如果你沒有交通。如果Keepalive探測未被對方回覆,則可以斷言該連接不能被視爲有效,然後採取正確的操作。

如果您有一個服務器作爲實例,並且很多客戶端可以連接到它,而無需定期發送,那麼最終可能會導致客戶端不在那裏。客戶端可能已經重新啓動,並且這未被檢測到,因爲在這種情況下永遠不會發送FIN。

對於這種情況,保持存在。

從TCP的角度來看,活着並沒有什麼特別之處。因此,如果對等方未能確認keepalive,您將在套接字上接收0個字節,您將不得不關閉套接字的末尾。這是您當時唯一可以採取的糾正措施。

0

由於連接被TCP堆棧關閉,因此爲該連接分配的資源不會被清除。

只有當你不會再使用該連接。

如果客戶端閒置很長時間,我們會看到連接正在關閉。連接未在netstat輸出中列出。

下定決心。要麼你看到它,要麼你沒有看到它。你會看到的是在netstat中的CLOSE_WAIT中的端口。

請你幫我弄清楚,如果連接因保持活動失敗而關閉,應用程序如何得到通知。

下一次使用連接進行讀取或寫入時,您將獲得ECONNRESET。

相關問題