我有一个用 vb.net 开发的聊天应用程序。它用于办公室内连接在 LAN 网络中的 PC 之间的聊天。它使用 TCP/IP 端口 25025 连接到另一个。该应用程序运行良好。但在某些情况下,接收者不会收到聊天消息。
所以我只是在那台电脑上运行 netstat -an
命令,发现这么多的 tcp 端口及其状态。下面是它的一部分(错误案例)。我只显示了其中包含 25025 的行。
Proto Local Address Foreign Address State
TCP 0.0.0.0:25025 0.0.0.0:0 LISTENING
TCP 192.168.1.79:25025 192.168.1.60:1320 TIME_WAIT
TCP 192.168.1.79:25025 192.168.1.60:1321 TIME_WAIT
TCP 192.168.1.79:58508 192.168.1.60:25025 TIME_WAIT
TCP 192.168.1.79:58509 192.168.1.60:25025 TIME_WAIT
TCP 192.168.1.79:58510 192.168.1.60:25025 TIME_WAIT
TCP 192.168.1.79:58511 192.168.1.60:25025 ESTABLISHED
然后我检查了相同的命令,我的应用程序没有出现任何错误(我的应用程序正常工作)。输出是,
TCP 192.168.1.60:25025 192.168.1.79:58511 ESTABLISHED
那我该如何解决呢?这么多25025的端口是什么意思。在错误情况下,我有很多 25025 端口,如上所示。所以请帮助我理解这一点并解决问题。
最佳答案
检查 bind() 调用是否成功。我的猜测是,当您的应用程序绑定(bind)到监听端口时,它会失败并显示错误“地址已在使用中”。 netstat 输出中的 TIME_WAIT 行表明情况确实如此。但我猜你的应用程序没有检查 bind() 的返回值,而是盲目地继续假设调用成功。这可以解释为什么它从来没有收到任何东西。
如果套接字尚未从上一次应用程序调用中完成关闭,您会得到“地址已在使用中”。通常,套接字在被应用程序关闭后需要大约 4 分钟才能准备好重新使用,同时状态为 TIME_WAIT。
您可以使用 SO_REUSEADDR 套接字选项来避免这个 TIME_WAIT 周期。
关于vb.net - 应用程序的 TCP 端口状态检查。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16184075/