Linux上的SO_REUSEADDR错误行为

时间:2019-06-10 02:42:03

标签: sockets nat hole-punching

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下失败。

有什么办法可以使它工作?如果不是,这种行为是从哪里来的?

0 个答案:

没有答案