在使用 TcpClient 網(wǎng)絡(luò)連接中常常會發(fā)生客戶端連接異常斷開, 服務(wù)端需要設(shè)置檢測手段進(jìn)行這種異常的處理;
1、對于短連接,
通過對 Socket 屬性ReceiveTimeout 和 SendTimeout 設(shè)置恰當(dāng)?shù)闹? 使得程序在進(jìn)行讀/寫時超時, 會產(chǎn)生 SocketException 異常, 通過檢查這個異常并進(jìn)行處理,來完成對異常斷開的檢測處理. 服務(wù)端連接處理代碼如下:
Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, true); //必須先啟用接收超時選項,設(shè)置接收超時才有用。
Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, true); //必須先啟用發(fā)送超時選項,設(shè)置發(fā)送超時才有用。
Socket.ReceiveTimeOut=10000;//毫秒
Socket.SendTimeOut=10000;//毫秒
2、對于長連接
可以通過 Socket 中的心跳檢測機(jī)制進(jìn)行處理.
Socket的底層IO一般通過 WSAIoctl 函數(shù)進(jìn)行設(shè)置. C# 中對此函數(shù)進(jìn)行了封裝, 即Socket.IOControl 方法.
publicint IOControl(
IOControlCode ioControlCode,
byte[] optionInValue,
byte[] optionOutValue
)
其中第一個參數(shù)為 Socket IO 控制代碼; 第二個參數(shù)為傳入?yún)?shù)值, 第三個參數(shù)為傳出值.
在Winsock 2 中定義了許多 Socket IO 控制類型 , 其中有一項: KeepAliveValues , 控制 TCP keep-alive 數(shù)據(jù)包的發(fā)送以及發(fā)送間隔。默認(rèn)值為2個小時, 當(dāng)間隔時間超過這個設(shè)定后, socket就會連續(xù)發(fā)送5次連接信號, 若客戶端無回應(yīng), 則此 client socket會斷開.
我們可以如下調(diào)整這個間隔時間:
newClient.Client.IOControl(IOControlCode.KeepAliveValues,BitConverter.GetBytes(120), null); // 設(shè)置為 2分鐘.
以上即為2種網(wǎng)絡(luò)異常連接斷線檢測的設(shè)置方法.