关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

C#进行SOCKET开发---当连接与与服务器断开时的问题

发布时间:2019-12-30 17:10:52

近日在进行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连接已断开,调用处理方法

}



/template/Home/Zkeys/PC/Static