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