我一直在使用C#編寫套接字客戶端程序,並且想知道如何檢測套接字的另一端何時斷開連接,如同拔下網絡電纜或硬重置一樣。如何檢測斷開的套接字C#?
我有下面這些功能訪問套接字並根據SO質疑here這MSDN article,檢查斷開的插座的最佳方法是發送一個1字節消息的長度爲0的如果一個異常被拋出,並且WSAEWOULDBLOCK不是錯誤代碼,那麼套接字斷開連接。我已經嘗試過,但是在硬重置服務器連接之後,客戶端將調用Send(new byte[1], 0, 0, SocketFlags.None)
併成功返回,並且Receive()
命令之後返回WSAEWOULDBLOCK錯誤。
什麼給?
下面是我的代碼如下。 _socket
設置爲非阻塞模式:
private int nonBlockRecv(byte[] recvBytes, int offset, int size, SocketFlags sf)
{
int bytesRecv = 0;
while (true)
{
try
{
nonBlockSend(new byte[1], 0, 0, sf);
bytesRecv = _socket.Receive(recvBytes, offset, size, sf);
break;
}
catch (SocketException excp)
{
if (excp.ErrorCode != 10035) // WSAEWOULDBLOCK
throw excp;
}
}
return bytesRecv;
}
private int nonBlockSend(byte[] sendBytes, int offset, int size, SocketFlags sf)
{
int bytesSent = 0;
while (true)
{
try
{
_socket.Send(sendBytes, offset, size, sf);
break;
}
catch (SocketException excp)
{
if (excp.ErrorCode != 10035) // WSAEWOULDBLOCK
throw excp;
}
}
return bytesSent;
}
編輯:這可能是有益的,但服務器是Windows Mobile設備。我在另一個線程中讀到,不同的操作系統可能能夠在死亡時發送套接字關閉信號。也許Windows Mobile操作系統不這樣做?
1字節的消息怎麼能有長度爲零? :-) – 2011-04-15 17:53:36
很好的問題哈哈。這就是MSDN文章所說的。但是,如果我將尺寸設置爲1,那麼它就可以工作!我想這很明顯,但是通過流發送到服務器端套接字的額外位。我希望Receive()拋出一個異常,而不是如果套接字被關閉,但會阻塞一個,但似乎並不是這種情況... – Zac 2011-04-15 18:04:42