在服务器的开发过程中,经常需要打开/关闭它。自然不会立即释放端口,因为第 98 个错误导致服务器无法启动EADDRINUSE
。我不想SO_REUSEADDR
在套接字上使用它,无论如何我只需要硬关闭端口并启动服务器。
fuser -k номер/tcp
它似乎工作,但错误仍然存在一段时间,服务器没有挂在进程中 - 它正确关闭。
在这种情况下如何释放端口?
在服务器的开发过程中,经常需要打开/关闭它。自然不会立即释放端口,因为第 98 个错误导致服务器无法启动EADDRINUSE
。我不想SO_REUSEADDR
在套接字上使用它,无论如何我只需要硬关闭端口并启动服务器。
fuser -k номер/tcp
它似乎工作,但错误仍然存在一段时间,服务器没有挂在进程中 - 它正确关闭。
在这种情况下如何释放端口?
正如在大多数情况下发生的那样,问题原来是不同的......
开发的服务器通过 WebSocket 与客户端通信。关闭 WebSocket 连接涉及交换关闭帧。我测试了 WS-frame 的解析,但是我的手并没有到达正确的闭包处理(没有正确响应客户端,也没有读取它的闭包请求)——结果,服务器有时关闭,并且客户端发送到 void 的数据挂在此端口上的 TCP 上 - 然后是 ping 或关闭请求。系统并没有失去有人接他们的希望,并且保留了端口......
客户端(本实验中为火狐浏览器)一开始收到关闭的响应,就正确断开连接,服务器重启后,立即在同一个端口启动,没有
SO_REUSEADDR
出现 88 错误。是的,解决方案不是对问题原始主题的回答,而是让它作为此类问题的提醒 - 始终检查已开发应用程序中通信会话的正确终止。
ss -K
有时通过https://unix.stackexchange.com/a/511691/43898从外部关闭套接字会有所帮助,但这是在程序没有挂在 I/O 阻塞的情况下。