1

我在 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 端口,如上所示。所以请帮助我理解这一点并解决问题。

4

1 回答 1

0

检查 bind() 调用是否成功。我的猜测是,当您的应用程序绑定到侦听端口时,它会失败并显示错误“地址已在使用中”。netstat 输出中的 TIME_WAIT 行表明确实如此。但我猜你的应用程序没有检查 bind() 的返回值,并且假设调用成功,盲目地继续。这可以解释为什么它从来没有收到任何东西。

如果套接字尚未从应用程序的先前调用完成其关闭,您将获得“地址已在使用中”。通常,套接字在被应用程序关闭后准备好重新使用大约需要 4 分钟,同时状态为 TIME_WAIT。

您可以使用 SO_REUSEADDR 套接字选项来避免此 TIME_WAIT 周期。

于 2013-06-13T14:49:31.620 回答