设置端口复用,我们调用setsockopt()函数,并使用SO_REUSEADDR和SO_REUSEPORT选项。
一、SO_REUSEADDR主要有4方面的作用:
1、允许一个监听服务bind到现在正在被使用的端口上
例如: (1)创建一个套结字并bind到7080端口上,listen该套结字
(2)一个客户端connect该端口,accept该连接并转交给派生出来的子进程
(3)close监听套结字(注意此时子进程维护的客户端过来的连接依然存在)
(4)重新创建套结字并bind该7080端口,listen该套结字
最后一部在bind的时候会报错“Address already in use”,如果在bind之前用setsockopt设置SO_REUSEADDR选项,则不bind不会报错。
2、允许不同的进程bind到相同端口不同IP地址上
例如:主机上有两个IP,192.168.1.27(eth0) 192.168.18.17(wlan0)
进程A可以bind IP:192.168.1.27 端口:7080 (用netstat -ntl看时,192.168.1.27:7080)
进程B可以bind IP:192.168.18.17 端口:7080 (用netstat -ntl看时,192.168.18.17:7080)
进程C可以bind IP:INADDR_ANY 端口:7080 (用netstat -ntl看时,0.0.0.0:7080)
当有客户端请求连接时,依照最合适匹配原则,比如connect指定192.168.1.17,则A进程处理该连接,如果没有启动进程A和B,connect指定192.168.1.17,则C进程处理该连接。
3、允许同一个进程创建多个套结字bind到相同端口不同IP上,与2类似
4、允许完全多个套结字bind相同的端口跟IP,但需要协议支持,一般只有UDP协议支持此情况。
二、SO_REUSEPORT
1、该选项允许绑定相同的IP和端口,每个套结字都必须配置该选项
2、如果绑定组播地址,则与SO_RESUEADDR含义相同
除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。