我一直在使用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