我遇到了Socket.SendAsync方法未檢測到死TCP連接的問題。在我的客戶端/服務器應用程序中,服務器定期向連接的客戶端發送心跳。Socket.SendAsync沒有檢測到死TCP連接
我遇到的問題是,即使客戶端可能已經死亡,SendAsync方法的回調指示「SocketError.Success」,並且Socket.Connected屬性爲true,即使客戶端不再是「活」。所以,對於服務器來說,看起來心跳數據已正確發送並且客戶端仍然活着。
我每次都看到這個問題,客戶端PC要麼進入睡眠/休眠狀態,要麼當客戶端在VMWare實例中運行並且該實例被掛起時。我沒有看到這個問題,當客戶端關閉應用程序,從任務管理器殺死它,等
internal void InternalSendAsync(ByteDataChunk chunk)
{
asyncSendArgs.SetBuffer(chunk.Buffer, 0, chunk.Offset);
asyncSendArgs.UserToken = chunk;
Socket.SendAsync(asyncSendArgs);
}
private void SendCompleted(object sender, SocketAsyncEventArgs args)
{
if (args.SocketError != SocketError.Success || !Socket.Connected)
{
InternalDisconnect(args.SocketError);
return;
}
// all is good & do some other stuff
}
任何人有任何想法是怎麼回事,爲什麼SendCompleted方法不返回SocketError即使客戶端已經很長時間了(我已經讓服務器運行了幾個小時,並且死亡套接字從未被檢測到)?
感謝,
湯姆
對 - 這是通常的做法。如果客戶端在秒內未對心跳做出響應,則認爲它已經死機並斷開連接。 –
caf
2010-08-19 01:25:43
我同意這將是一種方法來做到這一點,但我從來沒有見過這個問題與同步發送,因爲我總是收到發送錯誤後,即使主機進入睡眠/休眠 – TJF 2010-08-19 15:00:48