//我现在是使用花生壳来做动态域名解析,监听本地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是同步的,你设置接收超时时间
------解决思路----------------------
默认是无超时的,就是会永远的等下去