小笔记-setsockopt中SO_REUSEADDR选项

一 应用背景

     我们知道,对于面向连接的TCP协议,先调用close函数的一方会进入TIME_WAIT状态,在linux下这个状态大概会保留2分钟,如果这两分钟之内(可以看作是服务进程终止了)监听服务器重启,也就是调用socket、bind、listen重新启动,那么将会出现“Address already in use”的错误。但是如果设置了SO_REUSEADDR选项,则不会出现此情况。SO_REUSEADDR选项使得端口被释放之后马上可以被再次绑定使用。

SO_REUSEADDR提供如下四个功能

     SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重启监听服务器时出现若不设置此选项则bind时将出错。

    SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例只要每个实例捆绑一个不同的本地IP地址即可。对于TCP我们根本不可能启动捆绑相同IP地址和相同端口号的多个服务器。

    SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口上只要每个捆绑指定不同的本地IP地址即可。这一般不用于TCP服务器。

    SO_REUSEADDR允许完全重复的捆绑:当一个IP地址和端口绑定到某个套接口上时还允许此IP地址和端口捆绑到另一个套接口上。一般来说这个特性仅在支持多播的系统上才有而且只对UDP套接口而言(TCP不支持多播)。


建议

      在所有TCP服务器中,在调用bind之前设置SO_REUSEADDR套接口选项;
      当编写一个同一时刻在同一主机上可运行多次的多播应用程序时,设置SO_REUSEADDR选项,并将本组的多播地址作为本地IP地址捆绑。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值