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