C# 網路連接中異常斷線的處理:ReceiveTimeout, SendTimeout 及 KeepAliveValues(設置心跳) 在使用 TcpClient 網路連接中常常會發生客戶端連接異常斷開, 服務端需要設置檢測手段進行這種異常的處理; 1、對於短連接, 通過對 Socket 屬性Rec ...
C# 網路連接中異常斷線的處理:ReceiveTimeout, SendTimeout 及 KeepAliveValues(設置心跳)
在使用 TcpClient 網路連接中常常會發生客戶端連接異常斷開, 服務端需要設置檢測手段進行這種異常的處理; 1、對於短連接, 通過對 Socket 屬性ReceiveTimeout 和 SendTimeout 設置適當的值, 當在進行讀/寫時超時, 則會產生 SocketException 異常, 通過檢查這個異常併進行處理. 如下服務端連接處理代碼示例:Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, true); //必須先啟用接收超時選項,設置接收超時才有用。
Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, true); //必須先啟用發送超時選項,設置發送超時才有用。
Socket.ReceiveTimeOut=10000;//毫秒
Socket.SendTimeOut=10000;//毫秒
2、對於長連接
可以通過 Socket 中的心跳檢測機制進行處理.
Socket的底層IO一般通過 WSAIoctl 函數進行設置. C# 中對此函數進行了封裝, 即Socket.IOControl 方法.
publicint IOControl(
IOControlCode ioControlCode,
byte[] optionInValue,
byte[] optionOutValue
)
其中第一個參數為 Socket IO 控制代碼; 第二個參數為傳入參數值, 第三個參數為傳出值.
在Winsock 2 中定義了許多 Socket IO 控制類型 , 其中有一項: KeepAliveValues , 控制 TCP keep-alive 數據包的發送以及發送間隔。預設值為2個小時, 當間隔時間超過這個設定後, socket就會連續發送5次連接信號, 若客戶端無回應, 則此 client socket會斷開.
我們可以如下調整這個間隔時間:
newClient.Client.IOControl(IOControlCode.KeepAliveValues,BitConverter.GetBytes(120), null); // 設置為 2分鐘.
以上即為2種網路異常連接斷線檢測的方法.