有什么方法可以解除先前由某个程序崩溃时所绑定的端口的绑定吗?我不喜欢每小时重新启动开发机器。
答案1
当程序具有连接时,并且在终止进程后,可以定义端口停留的超时时间。
更改超时所涉及的内核变量是:
/proc/sys/net/ipv4/tcp_tw_reuse
- 当从协议角度来看安全时,这允许为新连接重用处于 TIME_WAIT 状态的套接字。默认值为 0(禁用)。/proc/sys/net/ipv4/tcp_fin_timeout
- 此设置确定 TCP/IP 可以释放已关闭的连接并重用其资源之前必须经过的时间。在此 TIME_WAIT 状态期间,重新打开与客户端的连接的成本低于建立新连接的成本。通过减少该条目的值,TCP/IP 可以更快地释放关闭的连接,从而为新连接提供更多资源。
您可以通过以下方式暂时更改它:
sudo sysctl -w sudo sysctl -w net.ipv4.tcp_fin_timeout=30
sudo sysctl -w sudo sysctl -w net.ipv4.tcp_tw_reuse=1
或者要永久添加配置,编辑/etc/sysctl.conf
并添加:
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_tw_reuse=1
因此,它也将在启动时应用。
如需进一步指导,请阅读:减少 TIME_WAIT 套接字连接
在应用程序级别,您还可以根据这篇文章在打开袜子时指定 SO_REUSEADDR:https://stackoverflow.com/questions/767292/how-do-i-close-a-port-in-a-case-of-program-termination
正如 dr01 所说,另一种选择是手动执行:
service networking restart