如何“释放” TCP 端口?

Ale*_*lex 4 linux tcp socket

我有一些侦听特定 TCP 端口的代码。但是,当我停止此代码并随后快速重新启动它时,我看到了错误

ERROR: could not bind to socket on 0.0.0.0:7700
Run Code Online (Sandbox Code Playgroud)

如果我等一分钟左右,突然这个端口是“空闲的”并且代码再次运行。

我的问题:有没有办法强制这个特定端口“免费”?能够立即启动我的代码,而无需等待一分钟左右?

Kot*_*tte 6

您可以使用 SO_REUSEADDR

int optval = 1;
/* create socket using socket */
setsockopt(s1, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval);
/* bind socket */
Run Code Online (Sandbox Code Playgroud)

您收到此错误是因为 TCP 协议强制服务器将您刚刚关闭的套接字TIME_WAIT置于net.ipv4.tcp_fin_timeout. 这是为了确保在您的服务器关闭套接字后其他对等方可能发送的每个数据包仍然得到正确处理。

这是该线程的最佳答案中对这个问题的一个很好的描述:SO_REUSEADDR (setsockopt option) - Linux 的含义是什么?.