TcpClient.Connected返回true但客户端未连接,我可以使用什么?

在VB.net中,我使用TcpClient来检索数据字符串。 我一直在检查.Connected属性以validation客户端是否已连接,但即使客户端断开连接,它仍然返回true。 我可以使用什么作为解决方法?

这是我当前代码的精简版:

Dim client as TcpClient = Nothing client = listener.AcceptTcpClient do while client.connected = true dim stream as networkStream = client.GetStream() dim bytes(1024) as byte dim numCharRead as integer = stream.Read(bytes,0,bytes.length) dim strRead as string = System.Text.Encoding.ASCII.GetString(bytes,0,i) loop 

我想,如果客户端断开连接,至少GetStream()调用会抛出一个exception,但是我已经关闭了另一个应用程序但它仍然没有…

谢谢。

编辑轮询客户端。建议使用但不能解决问题。 如果客户端没有’acutally’连接可用,则返回0。

关键是我试图让连接保持打开状态,并允许我通过同一个套接字连接多次接收数据。

当NetworkStream.Read返回0时,连接已关闭。 参考 :

如果没有可用于读取的数据,则NetworkStream.Read方法将阻塞,直到数据可用。 为避免阻塞,您可以使用DataAvailable属性来确定数据是否在传入网络缓冲区中排队等待读取。 如果DataAvailable返回true,则Read操作将立即完成。 Read操作将读取尽可能多的数据,最多可达size参数指定的字节数。 如果远程主机关闭连接,并且已收到所有可用数据,则Read方法将立即完成并返回零字节。

更好的答案:

  if (client.Client.Poll(0, SelectMode.SelectRead)) { byte[] checkConn = new byte[1]; if (client.Client.Receive(checkConn, SocketFlags.Peek) == 0) { throw new IOException(); } } 

而不是轮询client.connected,可能使用NetworkStream的属性来查看是否没有更多数据可用?

无论如何,有一篇ONDotnet.com文章,关于听众和诸如此类的信息。 应该帮助你解决问题…