我有一个使用TcpClient和TcpListener通过网络进行通信的应用程序。但是,当我在客户端上调用TcpClient.Close使其与服务器断开连接时,服务器根本不响应。

现在,在您发表关于此问题的评论时,该问题是this的重复,以及如何找到here的解决方案,当我说我已经找到并尝试了它们时,请相信我。没有帮助我还尝试了TcpClient.CloseTcpClient.GetStream().Close()TcpClient.Dispose的不同组合。没用。

该代码没有什么值得注意的地方,只是客户端中的Disconnect方法可重置所有变量以供重用,并关闭所有网络资源。服务器有一个循环,用于检查TcpClient.Connected是否为真,如果为false,则应跳出循环并终止线程。

有任何想法吗?

最佳答案

TcpClient.Connected应该几乎被忽略。它基本上代表了上一次通信是否成功。从MSDN(重点是我):


  由于Connected属性仅反映最新操作的连接状态,因此您应尝试发送或接收消息以确定当前状态。消息发送失败后,此属性不再返回true。请注意,此行为是设计使然。您无法可靠地测试连接状态,因为在测试和发送/接收之间的时间内,连接可能已经丢失。您的代码应假定套接字已连接,并且可以正常处理失败的传输。


如果在客户端调用Close(),则不会有任何内容发送到服务器以告知服务器已关闭,它实际上只是自我关闭,因此客户端无法再使用它。确定您是否仍处于连接状态的唯一可靠方法是尝试发送数据并处理故障。如果希望执行自己的握手协议,则在调用Close()时,会向服务器发送一条特殊通知,以警告该事实,但是有时该数据包永远不会到达服务器。

关于c# - TcpClient.Close不会关闭连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4879341/

10-10 22:33