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秒退出
后延迟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;
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);
====================================
在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秒退出
后延迟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;
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);
====================================
在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);