[英]How to get status of socket when network cable disconnect from network adapter
我在不同的計算機上用C#,服務器和客戶端程序編寫了一個帶c / s模式的通信程序。 今天客戶端程序連接到服務器progarm后,我從網絡適配器拔出電纜(此后,客戶端和服務器程序沒有做任何事情),發生了奇怪的事情。 我發現服務器程序的socket仍然保持連接狀態。 我使用命令“netstat -a -n”來檢索網絡信息,並獲得如下信息:
TCP 192.168.1.2:3645 192.168.1.3:1863已建立
192.168.1.2(服務器IP地址)192.168.1.3(客戶端IP地址)
有人知道原因嗎? 如何解決這個問題呢 。 我想知道服務器程序如何接收事件並在拔出客戶端計算機的網絡電纜時關閉套接字。
請給我一些建議或解決方案。
謝謝
我認為可以通過使用TCP keepalive來解決。 參考http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html
連接后,設置socket keepalive屬性。 msdn說這個開關默認狀態是關閉的,如果將keepalive設置為on,socket會自動檢查網絡狀態,並且在socket上次操作后首先檢查時間是2小時。 但時間可以縮短。 然后在第一次檢查后,套接字將服務時間。 如果連接斷開或死亡,套接字將拋出異常。
C#來源:
uint dummy = 0;
byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
//set keepalive on
BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);
//interval time between last operation on socket and first checking. example:5000ms=5s
BitConverter.GetBytes((uint)5000).CopyTo(inOptionValues, Marshal.SizeOf(dummy));
//after first checking, socket will check serval times by 1000ms.
BitConverter.GetBytes((uint)1000).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);
Socket socket = __Client.Client;
socket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);
我檢查過。 它運行正常。
你不能。 檢查連接狀態的唯一可靠方法是通過線路發送數據,因此:處理發送/接收期間的連接失敗,並且,如果您希望在空閑期間連接狀態,可選擇通過某種形式的ping定期檢查連接狀態。
我有點不確定,但是如果你拉動電纜后嘗試從插座中讀取數據,它會告訴你它已經不再連接了..
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.