我目前正在编写一个小型服务器应用程序,我的问题是,当我关闭我的应用程序(或者更好的是,在 eclipse 中按下终止按钮)时,套接字有时会保持打开状态,所以当我下次执行我的应用程序时,绑定() 将失败并显示“地址已在使用中”。程序退出时如何正确关闭套接字?我已经放了
close(mySocket);
在类析构函数中,但这似乎并没有改变任何东西。
用于netstat
确定您的端点处于什么状态。我的猜测是它处于任一状态TIME_WAIT
且未完全关闭。这对于 TCP 来说是正确的行为,并且存在允许可能仍然在以太网中的杂散段到达并且不会引起问题。的持续时间TIME_WAIT
类似于 2*MSL,即网络上段的最大生命周期的两倍,从而确保即使是重新传输的段也得到正确处理。
正如其他人所指出的,SO_REUSEADDR
只要对方的端点每次都不同,就是你的朋友。这是常见的情况,但有时人们会做一些奇怪的事情,比如将客户端绑定到特定端口,在这种情况下,您仍然会得到一个EADDRINUSE
b/c TCP 将会话定义为两个端点。
http://hea-www.harvard.edu/~fine/Tech/addrinuse.html应该回答你的很多问题。我倾向于使用 SO_REUSEADDR 来解决这个问题。
你设置SO_REUSEADDR
选项了吗?从你说的情况来看,似乎没有。
不要忘记检查close的返回值。当套接字成功关闭时,它将返回 0。如果失败,它将返回 -1。
您确定您的应用程序不是仍在后台运行吗?