近日在进行SOCKET开发时,遇到了一个问题,就是当客户端非正常退出时,服务端检测不到SOCKET的状态,使用Connected属性仍然为true,我通过查阅资料和试验,目前使用下面的思路来解决这一问题。
C#中判断socket是否已断开的方法
在C#中,Socket类的Connected属性只表示最后一次I/O操作的状态,如果这之后[连接的另一方]断开了,它还一直返回true, 除非你再通过socket来发送数据。所以通过这个属性来判断是行不通的!
有人说可以用Socket.Available属性来判断,msdn中说:如果[连接的另一方]断开了,它就会抛出异常。然而,这个BUG报告(http://dam.mellis.org/2004/08/net_socket_bugs_gotchas/)却指出:msdn的说法并不完全正确,这个属性只有在少数情况下才抛出异常。所以,这一招还是行不通!
事实上,Socket.Receive()方法在[连接的另一方]断开时,它返回结果告知只读了0个字节,我们可以籍由这一点来找出答案。这个问答(http://www.dotnet247.com/247reference/msgs/36/182526.aspx)给出了好的解决方案:可以调用Socket.Poll() 方法,为该方法的第二个参数传入SelectRead 值,如果该方法返回true, 则可以再由Socket.Receive()方法的返回值来判断。
我试验后的代码如下:
try
{
Socket s = new Socket(..);
if (s.Poll(0, SelectMode.SelectRead))
{
int nRead = s.Receive();
if (nRead == 0)
{
//socket连接已断开,调用处理方法
}
}
}
catch(SocketException ex)
{
//socket连接已断开,调用处理方法
}
Copyright © 2004-2024 Ynicp.com 版权所有 法律顾问:建纬(昆明)律师事务所 昆明市网翼通科技有限公司 滇ICP备08002592号-4