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

C 在进程退出时释放绑定端口,c,networking,sockets,C,Networking,Sockets,如何确保绑定到端口的套接字在进程退出时被正确释放,以便可以重用该端口,而不必bind()使用失败?我编写了一个小程序,它只创建一个套接字,将其绑定到一个固定端口,等待连接,然后立即终止。当我重新运行程序时,EADDRINUSE的bind()调用失败,但如果我等待几分钟,它就会成功 是否有一种方法可以显式“解除绑定”套接字,从而释放端口号?使用SO\u REUSEADDR socket选项将允许您毫不延迟地重新启动程序 int iSetOption = 1; ... sockfd = socket

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


是否有一种方法可以显式“解除绑定”套接字,从而释放端口号?

使用SO\u REUSEADDR socket选项将允许您毫不延迟地重新启动程序

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

TCP/IP堆栈使端口在
close()
-套接字将保持
TIME\u WAIT
TIME\u WAIT 2
状态后的一段时间内保持忙碌状态


如果我没有弄错的话,通常需要2分钟,因此如果您需要立即使用相同的端口,请在绑定之前在套接字上设置
so\u REUSEADDR
选项,就像Ivo Bosticky建议的那样。

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

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

但请注意,从技术上讲,使用SO_REUSEADDR违反了TCP/IP协议,使得绑定该端口的下一个程序能够(尽管不太可能)拾取用于原始程序的数据包。非常好,这正是我想要的。