![如何立即连接到端口,避免socket_bind():无法绑定地址?](https://linux22.com/image/30926/%E5%A6%82%E4%BD%95%E7%AB%8B%E5%8D%B3%E8%BF%9E%E6%8E%A5%E5%88%B0%E7%AB%AF%E5%8F%A3%EF%BC%8C%E9%81%BF%E5%85%8Dsocket_bind()%3A%E6%97%A0%E6%B3%95%E7%BB%91%E5%AE%9A%E5%9C%B0%E5%9D%80%EF%BC%9F.png)
当运行应该从 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