我一直在使用C#编写套接字客户端程序,并想知道如何检测套接字的另一端是否已经“不正常”断开,例如网络电缆被拔出或硬重置。我有以下函数来访问套接字,根据这里和MSDN文章中的SO问题,检查断开的套接字的最佳方法是发送一个长度为0的1字节消息。如果抛出异常并且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操作系统不能做到这一点?