Неверное поведение SO_REUSEADDR в Linux - PullRequest
1 голос
/ 10 июня 2019

Существует два способа использования SO_REUSEADDR:

  • привязка двух серверов к одному и тому же адресу (для производительности сервера)

  • привязка клиента затемсервер (например, для дырокола )

Кажется, что второй не работает на 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 в противном случае.

Есть ли способ сделатьэто работает?Если нет, то откуда это поведение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...