当前位置: 代码迷 >> C# >> 怎么判断TcpClient已断开连接
  详细解决方案

怎么判断TcpClient已断开连接

热度:66   发布时间:2016-05-05 02:59:54.0
如何判断TcpClient已断开连接
//我现在是使用花生壳来做动态域名解析,监听本地IP和端口,但是有时花生壳被占用,但是不能判断Tcpclient已经断开连接
 while (true)
  {
                try
                {
                    NetworkStream streamToClient = this.Tcpclient.GetStream();
                    byte[] buffer = new byte[1024];
                    //此句会造成阻塞,如果一直都接不到,就不会向下走,即使远程主动断线
                    int bytesRead = streamToClient.Read(buffer, 0, buffer.Length);
               }
               catch{ break; }
 }
//另开一个线程, 使用如下办法均没有弹出应有的异常
1. TcpClient.Client.Connected: 属性获取截止到最后的 I/O 操作时 Socket 的连接状态。Connected 属性的值反映最近操作时的连接状态。 如果您需要确定连接的当前状态,请进行非阻止、零字节的 Send 调用。 如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035),则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。(MSDN上还有一段代码)
2. TcpClient.Available: 如果远程主机处于关机状态或关闭了连接,Available 可能会引发 SocketException。
3. TcpClient.Client.Available: 如果远程主机处于关机状态或关闭了连接,则 Available 会引发 SocketException。
//
 经过多次尝试,只有使用如下代码,类似心跳包一样才能弹出异常
 NetworkStream streamToServer = this.Tcpclient.GetStream();
 byte[] buffer = thisEncoding.GetBytes(Data);
 streamToServer.Write(buffer, 0, buffer.Length);
还有没有更加高明的办法?

------解决思路----------------------
//此句会造成阻塞,如果一直都接不到,就不会向下走,即使远程主动断线
                    int bytesRead = streamToClient.Read(buffer, 0, buffer.Length);

Read是同步的,你设置接收超时时间
------解决思路----------------------
引用:
Quote: 引用:

//此句会造成阻塞,如果一直都接不到,就不会向下走,即使远程主动断线
                    int bytesRead = streamToClient.Read(buffer, 0, buffer.Length);

Read是同步的,你设置接收超时时间

我没有对其设置超时,然后我调试的时候,在循环内设置了断点,始终没有中;
难道超时默认值是很长的?

默认是无超时的,就是会永远的等下去