端口复用(SO_REUSEADDR)是干啥用的…
2015-10-10 09:19
274 查看
如果端口复用了(设置了socket的SO_REUSEADDR选项),在一个应用程序可以把n个套接字绑在一个端口上而不出错。那现在是不是可以从这些套接字中并发地读取了?答案是否定的——测试结果是只有最后一个套接字会正常接收数据。
端口复用最常用的用途应该是防止服务器重启时之前绑定的端口还未释放。这种情况下如果设定了端口复用,则新启动的服务器进程可以直接绑定端口,直接接过前辈的枪。如果没有设定端口复用,绑定会失败,提示ADDR已经在使用中——那只好等等再重试了,麻烦!
最近上网乱看,发现还有其他用途,摘抄自非常经典的UNPv1:
1、当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启动的程序的socket2要占用该地址和端口,你的程序
就要用到该选项。 (这就是我说的情况啦)
2、SO_REUSEADDR允许同一port上启动同一服务器的多个实例(多个进程)。但每个实例绑定的
IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器可以测试这种情况。
3、SO_REUSEADDR允许单个
进程绑定相同的端口到多个socket上,但每个socket绑定的ip地址不同。这和2很相似,区别请看UNPv1。
4、SO_REUSEADDR允许完全相同的地址和端口的重复绑定。但这只用于UDP的多播,不用于TCP。
相关文章推荐
- 正确实现和使用assert
- 《C陷阱与缺陷》书评兼感想
- RAII、异常、构造函数是一家人
- 一个笑话和其对开发的启示
- 并发环境下的单态——应用程序级单态…
- 《软件随想录》的随想
- 转载:敏捷估计和规划的12条指导原…
- 《设计模式》旧书重读和总结:创建…
- scrum-and-xp读书笔记
- error C2533: 构造函数不能有返回类型
- shell脚本 整数比较
- Go之对象拷贝
- 代码复用之道:回调机制及c++实现…
- 对候选字排列组合后输出的程序(用…
- boost::bind示例
- boost::bind简要介绍
- boost条件变量(condition_variable…
- 如何解决unix domain socket服务器…
- 高性能服务器编程感悟
- 跨平台进程间同步