当运行应该从 TCP/IP 端口读取的代码时,我经常收到以下消息(具体取决于所使用的语言):
socket_bind(): unable to bind address
我知道当其他进程侦听此端口/绑定到此端口时会发生这种情况(我不知道要描述的确切短语),因此我的代码无法侦听该端口。然而,它是我的代码我刚刚停止(通过 CTRL-C)它阻塞了这个端口!似乎涉及一些超时,等待一段时间(大约 30 秒)后,我可以启动我的代码来监听这个特定端口,没有任何问题。
我想知道:
- 为什么我已经停止了代码,端口仍然被阻止?
- 如何强制系统释放此端口,以便我可以重新启动代码并开始侦听此端口?
答案1
假设您正在谈论 C/C++,请使用setsockopt()
和SO_REUSEADDR
。只要没有活动进程侦听该端口,就可以重用。
编辑:它仍在使用的原因是您没有适当地关闭套接字。你 Control-C 杀死了它。您可以使用netstat
它来查看已打开或尚未完全关闭的端口。
http://www.beej.us/guide/bgnet/output/html/multipage/setsockoptman.html
https://stackoverflow.com/questions/10071107/rebinding-a-port-to-datagram-socket-on-a-difftent-ip