如何判断基于套接字的客户端连接是否已断开?

时间:2009-03-25 14:36:28

标签: c# .net networking sockets

如果我的客户端连接在另一个end( kill -9 server)上被破坏了。客户端需要几分钟才能确定出现问题。即使连接实际上已断开,Socket.Connected也会返回true。

一旦另一端断开链接,确定连接不存在的最快方法是什么?

客户端代码:

try{
      Socket socket= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     /*Assume there is a connection on the other end*/
      while (socket.Connected)
      {

          /*Do some processing*/
      }
 }catch (SocketException se){
       Console.WriteLine(ex.Message);
 } catch (Exception ex){
       Console.WriteLine(ex.Message);
 }
 finally
 {
   Console.WriteLine("something bad happen");
 }

6 个答案:

答案 0 :(得分:3)

这似乎对我有用......有没有人看到任何问题?

public bool IsConnected
{
         get {return !(Socket.Poll(1, SelectMode.SelectRead) 
                                  && m_socket.Available ==0)}
}

也可以加入扩展方法。

public static class SocketExtensions
{
  public static bool IsConnected(this Socket @this)
  {
    return !(@this.Poll(1, SelectMode.SelectRead) && @this.Available == 0);
  }
}

现在,您可以在处理套接字的代码中轻松使用它。

var mySocket = new Socket();
while(mySocket.IsConncted())
{
  // Do Stuff
}

答案 1 :(得分:1)

产生另一个不断ping服务器的线程 - 由于套接字不是活动连接,所以你可以做到最好。

答案 2 :(得分:1)

尝试检查Available属性,在连接关闭时应该抛出SocketException

Source

修改,以下是使用方式:

while(socket.Connected)
{
  try
  {
    while (socket.Available == 0)
      System.Threading.Thread.Sleep(100); // Zzzz
  }
  catch (SocketException)
  {
    // connection closed
    // do something
  }

  /* Do some processing */
}

您也可以尝试使用Poll方法。

来自Source

  

或者,您也可以使用   Poll()Socket方法用   SelectRead SelectMode参数。这个   如果,方法将返回一个真值   数据可用或连接   已被远程主机关闭。   然后,您需要区分   这些情况之间有哪些   发生(通过阅读插座   缓冲区,看看它是否返回   零值)。

答案 3 :(得分:0)

SendTimeout的{​​{1}}和/或ReadTimeout属性是否有帮助?

答案 4 :(得分:0)

我推荐你my answer到这个问题的C ++版本......

答案 5 :(得分:-1)

您是否尝试设置较短的连接超时?