Jes*_*erE 16 c sockets networking
如何确保在进程退出时正确释放绑定到端口的套接字,以便可以在bind()
不使用EADDRINUSE的情况下重用端口?我写了一个小程序,它只是创建一个套接字,将它绑定到一个固定的端口,等待连接,然后立即终止.当我重新运行程序时,bind()
调用因EADDRINUSE而失败,但如果我等了几分钟,它就会成功.
有没有办法可以明确地"取消绑定"套接字,从而释放端口号?
Ivo*_*cky 24
使用SO_REUSEADDR套接字选项将允许您立即重新启动程序.
int iSetOption = 1;
...
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
setsockopt(_sockfd, SOL_SOCKET, SO_REUSEADDR, (char*)&iSetOption,
sizeof(iSetOption))
...
Run Code Online (Sandbox Code Playgroud)
TCP / IP协议栈保持端口忙了一段时间后也close()
-插座会停留在TIME_WAIT
和TIME_WAIT2
状态。
如果我没记错的话,通常需要 2 分钟,所以如果您需要SO_REUSEADDR
在绑定之前立即在套接字上使用相同的端口设置选项,就像 Ivo Bosticky 建议的那样。