在进程退出时释放绑定端口

时间:2009-02-14 10:16:21

标签: c networking sockets

如何确保在进程退出时正确释放绑定到端口的套接字,以便在没有bind() EADDRINUSE失败的情况下重用端口?我写了一个小程序,它只是创建一个套接字,将它绑定到一个固定的端口,等待连接,然后立即终止。当我重新运行程序时,bind()调用因EADDRINUSE而失败,但如果我等待几分钟,它就会成功。

有没有办法可以明确地“取消绑定”套接字,从而释放端口号?

3 个答案:

答案 0 :(得分:24)

使用SO_REUSEADDR套接字选项可以让您立即重新启动程序。

int iSetOption = 1;
...
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
setsockopt(_sockfd, SOL_SOCKET, SO_REUSEADDR, (char*)&iSetOption,
        sizeof(iSetOption))
...         

答案 1 :(得分:4)

即使在close() - 套接字保持TIME_WAITTIME_WAIT2状态后,TCP / IP堆栈仍会使端口忙碌一段时间。

如果我没弄错的话,通常需要2分钟,所以如果你需要使用相同的端口,在绑定之前立即在套接字上设置SO_REUSEADDR选项,就像Ivo Bosticky建议的那样。

答案 2 :(得分:2)

不完全是您问题的答案,但为了完整性:

在Windows上,您可以设置 TcpTimedWaitDelay注册表值,用于将释放已关闭的TCP连接的超时设置为低至30秒。