socket程序退出后有时候端口还没有释放?请问高人如何解决啊。正确立马结帖。

时间:2021-10-17 15:22:52
处理如下信号,然后在sig_exit中close掉socket.但有时候端口没有释放掉。
signal(SIGINT, sig_exit);      /*设置中断退出*/
signal(SIGHUP, sig_exit);
signal(SIGQUIT, sig_exit);  
signal(SIGABRT, sig_exit);  
signal(SIGKILL, sig_exit); 
signal(SIGTERM, sig_exit);
signal(SIGCHLD, SIG_IGN );
signal(SIGSTOP, sig_exit);
signal(SIGXCPU, sig_exit);
signal(SIGPROF, sig_exit);
signal(SIGWINCH, sig_exit);   
signal(SIGIO, SIG_IGN );
signal(SIGPWR, sig_exit);
signal(SIGILL, sig_exit);
signal(SIGSEGV, sig_exit);

6 个解决方案

#1


close(socket);
后延迟10秒退出

#2


对,保险一点是自己主动关闭SOCKET

#3


netstat看端口是什么状态呢? time_wait状态是正常的。

#4


{
int opt = 1;
struct sockaddr_in addr;

memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = htonl(INADDR_ANY);

/* Set port reuse */
if ( setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*)&opt, sizeof(opt)) < 0 )
return SOCKET_ERROR;

if ( bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0 )
return SOCKET_ERROR;

#5


调用setsockopt,设置SO_REUSEADDR参数就可以了。然后无论进程如何退出,端口都不会被占用

#6


我也在找,抄一份给你,不知道能不能用
====================================
在Linux系统中,如果一个socket绑定了某个端口,该socket正常关闭或程序退出后,在一段时间内该端口依然保持被绑定的状态,其他程序(或者重新启动的原程序)无法绑定该端口。可以在获得socket描述符之后通过调用setsockopt语句避免该问题:
int sockfd;
int opt = 1;
int len = sizeof(opt);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, &len);

#1


close(socket);
后延迟10秒退出

#2


对,保险一点是自己主动关闭SOCKET

#3


netstat看端口是什么状态呢? time_wait状态是正常的。

#4


{
int opt = 1;
struct sockaddr_in addr;

memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = htonl(INADDR_ANY);

/* Set port reuse */
if ( setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*)&opt, sizeof(opt)) < 0 )
return SOCKET_ERROR;

if ( bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0 )
return SOCKET_ERROR;

#5


调用setsockopt,设置SO_REUSEADDR参数就可以了。然后无论进程如何退出,端口都不会被占用

#6


我也在找,抄一份给你,不知道能不能用
====================================
在Linux系统中,如果一个socket绑定了某个端口,该socket正常关闭或程序退出后,在一段时间内该端口依然保持被绑定的状态,其他程序(或者重新启动的原程序)无法绑定该端口。可以在获得socket描述符之后通过调用setsockopt语句避免该问题:
int sockfd;
int opt = 1;
int len = sizeof(opt);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, &len);