我有一些监听特定 TCP 端口的代码。但是,当我停止此代码并随后快速重新启动时,我看到了错误
ERROR: could not bind to socket on 0.0.0.0:7700
如果我等待一分钟左右,突然这个端口“空闲”并且代码再次运行。
我的问题:有没有办法强制这个特定端口“空闲”?能够立即启动我的代码,而无需等待一分钟左右?
答案1
您可以使用SO_REUSEADDR
int optval = 1;
/* create socket using socket */
setsockopt(s1, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval);
/* bind socket */
您收到此错误是因为 TCP 协议强制服务器将您刚刚关闭的套接字TIME_WAIT
置于 中定义的时间状态net.ipv4.tcp_fin_timeout
。这是为了确保在您的服务器关闭套接字后其他对等方可能发送的每个数据包仍然得到正确处理。
以下是该线程的最佳答案中对此问题的很好的描述:SO_REUSEADDR(setsockopt 选项)的含义是什么 - Linux?。