2016-11-29 37 views
-1

我使用Winsock2,並通過IPv4製作了一個TCP套接字。如何從客戶端/服務器端檢測對方是否失去了網絡連接?

我知道如何檢測一側是否關閉連接(檢查recv函數的值),但如果一側失去了互聯網連接呢?

任何客戶端和服務器都無法檢測到另一端沒有更多的連接到網絡(使用此方法)。

+1

您需要使用heartbits,當客戶端或服務器停止發送它們時,您可以假設在另一端存在問題 – Rama

+0

您能否更好地解釋我?是否有關選項KEEP_ALIVE? – Serusar

+0

心跳包含服務器和客戶端之間定期發送的一些數據,以確保另一方存活。你可以用一個簡單的標籤消息和一些定時器邏輯來實現它。 – Rama

回答

0

在問這個問題之前,您可能至少需要了解OSI模型。 TCP,IPv4與媒體(以太網,互聯網)沒有任何共同之處,它們被封裝在其中。我認爲,你的意思是什麼,是一個連接斷開的情況(所謂的半開連接)。 TCP使用三向握手過程和四向連接關閉。連接建立後,如果任何一方都沒有發送數據,那麼沒有數據包會穿過使用的介質。 TCP是空閒協議,在它的層面上沒有從客戶端發送到服務器的「心跳」消息。

TCP被設計用於彈性和效率,允許電纜拔出並重新插入。這種設計也很有效,因爲沒有「輪詢」數據包通過網絡發送,只是爲了檢查連接是否仍然存在。爲什麼它不總是在現實生活中工作?通常是因爲在重新初始化連接之後,客戶端已經通過DHCP分配了新的IP,或者服務器已經標記了該連接超時。服務器是如何做到的?他們假設如果客戶端閒置時間過長,則連接可以安全關閉。客戶端軟件通常爲,旨在在需要時立即重新建立會話。某些需要更嚴格的會話流限制的應用程序級協議使用某種週期性的「心跳」數據包,也稱爲保持活動數據包。有一些ICMP協議客戶端或服務器可能嘗試使用,但有限制,包括ICMP可能會被NAT路由器或某些防火牆阻止。

有一個典型案例,心跳和超時不是協議的一部分:FTP。它被設計成兩個連接,一個是「命令通道」,一個是數據傳輸。爲了不使用客戶端池,如果在一定時間內沒有發送命令,FTP服務器通常會關閉數據連接。如果客戶要求「獲取」大文件會發生什麼?服務器可能在傳輸完成之前切斷傳輸。它可以通過「被動」FTP來解決,它是服務器端,它響應客戶端登錄而創建數據連接。這可能是不可能的,如果客戶端無法接收連接,在路由器後面。其他解決方案是客戶端週期性地發送一些不會導致很多流量的「虛擬」命令,例如「PWD」(獲取當前文件夾)。

有很多關於半開放式連接的主題,你應該自己決定,哪種設計更適合你。

+0

如果我從心理上了解所有這些情況,該怎麼辦?我知道OSI模型如何工作,我知道TCP如何工作。我問了一種方法來CODE這種情況。我需要處理半開連接。我如何使用Winsock2在C++中執行此操作?我只是無法弄清楚如何實現這一點。我需要在服務器端檢測客戶端何時放棄其連接,因爲我想關閉套接字並退出我的程序。 – Serusar

+0

幾乎你需要草擬什麼樣的協議,你將在客戶端和服務器之間使用,涉及到半開狀態檢測,然後實現它。沒有一套完整的工作流程或模式,特別是如果您使用純API而不是某些庫。有網絡的例子,你應該研究它們 – Swift

+0

@Serusar作爲協議的一部分,很少使用套接字選項https://msdn.microsoft.com/en-us/library/windows/desktop/ee470551(v=vs 0.85)的.aspx – Swift

相關問題