免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4693 | 回复: 6
打印 上一主题 下一主题

socket 设置了 SO_REUSEADDR 还无法重新绑定,请高手帮忙。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-04 12:57 |只看该作者 |倒序浏览
在一个 deamon 程序中, SOCKET监听一个端口, 处理接受连接, 如果程序正常退出, 有一些端口的连接还处在 TIME_WAIT 状态,再开起程序设置了 SO_REUSEADDR 发现仍然无法使用,返回errno 98, 系统是 Redhat AS4.

有个类似的帖子中高手提到注意信号,我的程序中确实设置了 SIGINT, SIGHUP, 不过发现即使不设置也一样。

这个是什么原因导致的呢? 还请高人指点。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2008-06-04 14:00 |只看该作者
原来的socket也要设置SO_REUSEADDR选项。
还有如果<localip, localport, romoteip, remoteport>
前后一样的话,设置SO_REUSEADDR选项也没用的。

论坛徽章:
0
3 [报告]
发表于 2008-06-04 14:10 |只看该作者
因为是同一个程序,前后两次设置是一样的,
由于是监听端口,只有 localip, localport。

论坛徽章:
0
4 [报告]
发表于 2008-06-04 15:41 |只看该作者
如果该端口还处在监听状态,就无法重新绑定,即使设置了SO_REUSEADDR。建议使用netstat -l命令查看一下该端口是否还在监听。
如果是使用多进程的话,有可能是子进程没有关闭监听的套接口,造成虽然父进程退出,关闭了监听套接口,但是由于子进程的存在,监听套接口依然没有真正关闭,端口依然处于监听状态。

论坛徽章:
0
5 [报告]
发表于 2008-06-04 16:02 |只看该作者
没有监听了, 只有几个连接处于 TIME_WAIT 状态。

论坛徽章:
0
6 [报告]
发表于 2008-06-04 17:37 |只看该作者
当两个socket的address和port相冲突,而你又想重用地
址和端口,则旧的socket和新的socket都要已经被设置了SO_REUSEADDR特性,只
有两者之一有这个特性还是有问题的。
    SO_REUSEADDR可以用在以下四种情况下。
    (摘自《Unix网络编程》卷一,即UNPv1)
    1、当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启
动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。
    2、SO_REUSEADDR允许同一port上启动同一服务器的多个实例(多个进程)。但
每个实例绑定的IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器可
以测试这种情况。
    3、SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上,但每个soc
ket绑定的ip地址不同。这和2很相似,区别请看UNPv1。
    4、SO_REUSEADDR允许完全相同的地址和端口的重复绑定。但这只用于UDP的
多播,不用于TCP。

论坛徽章:
0
7 [报告]
发表于 2008-06-04 18:54 |只看该作者
REUSEPORT ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP