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

csdnbill 2004-08-11 09:04:27
处理如下信号,然后在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);
...全文
871 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pacman2000 2004-08-11
  • 打赏
  • 举报
回复
netstat看端口是什么状态呢? time_wait状态是正常的。
AQ0421 2004-08-11
  • 打赏
  • 举报
回复
对,保险一点是自己主动关闭SOCKET
我不懂电脑 2004-08-11
  • 打赏
  • 举报
回复
close(socket);
后延迟10秒退出
ksycsdn 2004-08-11
  • 打赏
  • 举报
回复
我也在找,抄一份给你,不知道能不能用
====================================
在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);

jianzy 2004-08-11
  • 打赏
  • 举报
回复
调用setsockopt,设置SO_REUSEADDR参数就可以了。然后无论进程如何退出,端口都不会被占用
dchg2000 2004-08-11
  • 打赏
  • 举报
回复 1
{
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;

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧