2013-04-22 189 views
1

我有一個tcp客戶端/服務器,我想檢測客戶端的連接丟失;因爲我的客戶端有多個接口,並且我一次連接到其中一個接口的服務器,所以我想知道如何檢測客戶端的連接丟失,以便我可以將我的tcp客戶端與另一個接口連接到服務器,並且如果所有這些接口我將我的數據存儲在文本文件中。我GOOGLE了它,我已經看到保持活力,但它不是我想要的。如何檢測tcp客戶端連接到c + +服務器

如果它很重要我的項目是在linux和代碼是在c + +。

回答

3

我發現的最好方法是檢查緩衝區,如果緩衝區爲空,這意味着您的TCP客戶端將數據包成功發送到TCP服務器,您可以發送下一個數據包;檢查緩衝區,你可以使用SIOCOUTQ;它非常易於使用,並向您顯示您的緩衝區中有多少數據。

+0

好主意。如果您過早檢查ioctl,您如何避免競爭狀況?另外[SIOCOUTQ似乎是Linux專用](http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable )意味着這不是Windows開發人員的解決方案。 – 2013-04-26 04:02:56

+1

@SergeIvanoff我知道它不支持在Windows中,但正如我在Linux中編碼的問題中提到的,我尋求我的問題的解決方案;我沒有問這個問題來解決別人的問題! 如果我太快檢查ioctl我會等待它響應,如果我得到錯誤我沒有關閉我的套接字,如果ioctl沒有響應,但我會等待將近1分鐘,如果在這段時間我的數據仍然在緩衝區I將關閉我的套接字。 – Lrrr 2013-04-27 09:02:43

1

嘗試從套接字讀取。當套接字關閉時,讀取將失敗,給您簡單的檢測。您可以在專用檢測線程中執行此操作,以便您的主線程不會阻塞。

+0

如果一個接口損失連接到互聯網劑量這關閉插座?(我的接口都是3G) – Lrrr 2013-04-22 10:50:10

+0

是的。遠程機器可能需要一點時間才能注意到(但爲了防止由於兩臺機器之間的網絡問題而導致錯誤的套接字關閉,您需要花費這段時間)。 – mah 2013-04-22 11:09:08

+0

爲什麼你會打開一個連接,並且沒有讀線程?我不是說在一個單獨的線程中。我的意思是,如果你沒有從套接字讀取數據,有一個客戶端連接有什麼意義? – 2013-04-22 12:45:41

1

TCP連接被設計爲糾錯而不是時間關鍵。此錯誤更正包括網絡超時。

直到套接字實際關閉,讀取和寫入纔會失敗,這可能不會很長時間。

客戶端決定連接是否超時的唯一方法是讓客戶端檢測到它在指定時間內沒有收到任何消息,然後手動關閉套接字。

這就是Keep Alive消息的用途。

+0

我的客戶將不會收到任何消息!由於我們的設計只有客戶端會發送消息到服務器!如果我的客戶端收到消息,我將很容易檢測到客戶端和服務器連接! – Lrrr 2013-04-23 13:27:48

+0

在這種情況下,沒有辦法。如果存在網絡延遲,則在重新建立連接後,TCP緩衝消息以嘗試恢復。我肯定有一些原因,如果你寫了太多的數據,你會得到一個「緩衝區已滿」的消息,但這取決於底層的網絡緩衝區大小。您的服務器設計必須更改爲發送保持活動狀態(或狀態消息,如果您喜歡)。 – 2013-04-24 00:33:21

+0

我解決了這個問題,沒有keepalive和其他服務器響應。 – Lrrr 2013-04-24 13:35:04