我现在正在研究与 ESP32 中运行的 tcp 服务器的 tcp 套接字连接。
通信工作正常,但我无法关闭连接。
在搜索关闭/重置 tcpClient 上的解决方案后,似乎关闭 tcpClient 的正确方法应该是:
tcpClient.GetStream().Close();
tcpCLient.Close();
The msdn 中的示例 https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.close(v=vs.110).aspx也用这个方法。
但不幸的是,它无法真正关闭连接。在mcu中检查,连接尚未关闭。即使我稍后关闭应用程序,它也不会关闭。在这种情况下,MCU的tcp连接无法释放,也无法接收其他连接。所以,我认为这不应该是关闭 tcpClient 的正确解决方案。
如果我不执行上面的语句,直接关闭应用程序,就可以成功关闭连接。并且MCU的tcp连接被释放。
似乎在应用程序关闭中做了一些事情,可以真正关闭连接。
在某些情况下,我需要在执行某些操作后关闭连接,然后重新连接。所以,我不能依赖应用程序关闭。
我尝试了以下所有方法的不同组合,但没有一个能够成功释放 tcpClient 连接:
tcpClient.Close();
tcpClient.Client.Close();
tcpClient.GetStream().Close();
tcpClient.Client.Disconnect(true);
tcpClient.Client.Disconnect(false);
tcpClient.Dispose();
tcpClient.Client.Dispose();
tcpCLient = null;
也许应该按正确的顺序使用上述一些命令来完成。
有谁知道我如何无法自己关闭连接。
提前致谢。
使用WireShark研究网络数据包后,发现问题是由于发送RST的延迟造成的,代码如下MSDN中建议的:
tcpClient.GetStream().Close();
tcpCLient.Close();
即使添加也没有什么不同
tcpClient.LingerState = new LingerOptions(true, 0);
因为Close方法后会立即发送FIN,但不会发送RST,所以会在2分钟左右发送。不幸的是,即使您在发出 tcpClient close 后关闭应用程序,也不会发送该消息。
如果您在关闭 tcpClient 之前关闭应用程序,它将立即发送 RST。
这样它就可以立即关闭与服务器的连接。
经过测试不同的命令组合,发现下面的代码确实可以立即关闭连接,但大约40秒后会有另一个RST。
tcpClient.Client.Close();
tcpClient.Close();
不要调用 tcpClient.GetStream().Close(); !!!这会导致RST的延迟。
我不知道以这种方式关闭连接是否有任何影响,但这是我真正可以立即关闭连接的唯一方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)