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

    技术2024-08-02  67

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

    }

    最新回复(0)