linux下tcp socket的SO_REUSEPORT和SO_REUSEADDR

SO_REUSEADDR

linux下多个tcp socket不能同时bind到一个ip:port上,但是可以bind到不同的ip相同的port上,前提是都要设置SO_REUSEADDR选项为true。否则会返回address already in use。

比如bind(127.0.0.1:80) bind(192.168.0.10:80) bind(10.0.0.12:80)这取决于有多少个网络接口,客户端connect的时候选择不同的ip和端口连接就可以了。

如果试图bind到同一个ip:port上,也必须是在前一个socket关闭,连接处于time_wait状态的时候。这种情况下大都是为了服务程序能够快速的重新启动,避免等待。


实际测试结果,假设我们本地是有2个ip地址127.0.0.1和10.0.0.1,服务端口为80,INADDR_ANY=0.0.0.0

如果设置了SO_REUSEADDR为1

1,先bind(0.0.0.0)成功,如果再bind(127.0.0.1)和bind(10.0.0.1)都会失败

2,先bind(127.0.0.1)成功,如果再bind(0.0.0.0)会失败,但bind(10.0.0.1)会成功

3,先bind(10.0.0.1)成功,如果再bind(0.0.0.0)会失败,但bind(127.0.0.1)会成功

4,先bind(x.x.x.x)成功,如果再bind(x.x.x.x)肯定失败



SO_REUSEPORT

linux下多个tcp socket可以同时bind到一个ip:port上,前提是都要设置SO_REUSEPORT选项为true。否则会返回address already in use。

当客户端connect这个ip:port的时候,实际上只有一个bind的socket是有效的,其他bind的socket是无法收到connect数据的。这个socket貌似也是系统随机挑选的,没有严格顺序。

实际测试结果,假设我们本地是有2个ip地址127.0.0.1和10.0.0.1,服务端口为80,INADDR_ANY=0.0.0.0

如果设置了SO_REUSEPORT为1

1,先bind(x.x.x.x)成功,如果再bind不同的ip都会成功

只是在数据的流向上会优先流向显示指定ip地址的socket。

比如bind(0.0.0.0)和bind(10.0.0.1)之后,

如果客户端connect(10.0.0.1),那就是第二个socket来接收数据。如果第二个socket关闭了,那则改为第一个socket来接收连接。

如果客户端co

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值