前言:
下文解决如下几个问题:
1)多个进程是否可以同时绑定同一个端口?
2)fork()之前创建的socket,父子进程能否同时读/写此socket?
3)bind的时候提示“address already used”的话,该如何处理?
正文:
linux - How do SO_REUSEADDR and SO_REUSEPORT differ? - Stack Overflow
结论:
1)多个进程可以同时绑定同一个端口,但是ip地址不能一样,即可以绑定到不同的网卡上。
2)fork()创建的socket,父子进程可以同时读/写此socket,父子进程会轮流获得socket读/写权,这点好像和1)冲突,需要详细研究内因。
3)bind提示“address already used”,可以通过为socket设置SO_REUSEADDR
解决,但是需要遵循ip地址不一样的大原则,即1)中的描述,具体参照下表:
SO_REUSEADDR socketA socketB Result --------------------------------------------------------------------- ON/OFF 192.168.0.1:21 192.168.0.1:21 Error (EADDRINUSE) ON/OFF 192.168.0.1:21 10.0.0.1:21 OK ON/OFF 10.0.0.1:21 192.168.0.1:21 OK OFF 0.0.0.0:21 192.168.1.0:21 Error (EADDRINUSE) OFF 192.168.1.0:21 0.0.0.0:21 Error (EADDRINUSE) ON 0.0.0.0:21 192.168.1.0:21 OK ON 192.168.1.0:21 0.0.0.0:21 OK ON/OFF 0.0.0.0:21 0.0.0.0:21 Error (EADDRINUSE)