SO_REUSEADDR有两种用途:
将两个服务器绑定到同一地址(以提高服务器性能)
先将客户端绑定到服务器,再绑定服务器(例如,hole punching)
第二个似乎不能在linux上运行(我在RedHat和Chromium OS上进行了测试),尽管它可以在macOS上运行。
我做了这个小代码:
import socket
conn = socket.create_connection(("google.fr", 80))
if len(conn.getsockname()) == 2:
family = socket.AF_INET
else:
family = socket.AF_INET6
s = socket.socket(family)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
s.bind(conn.getsockname())
此代码在macOS上有效,但在OSError: [Errno 98] Address already in use
下失败。
有什么办法可以使它工作?如果不是,这种行为是从哪里来的?