3

Попытка прослушивания уже используемого порта (например, запуск двух экземпляров одного и того же сервера сокетов) в Windows дает:

[WinError 10048] Обычно разрешено только одно использование каждого адреса сокета (протокол / сетевой адрес / порт)

Я запутался , почему только одно использование адреса обычно разрешается. У меня сложилось впечатление, что это абсолютное правило (по крайней мере, для Unix), но, видимо, нет. В каких случаях (и как) могут быть две программы, использующие один и тот же адрес сокета? Или я неправильно понимаю эту ошибку?

1 ответ1

3

Это не абсолютное правило на всех системах UNIX. У некоторых есть расширения, которые позволяют нескольким процессам связываться с одним и тем же адресом и комбинацией портов, и ядро затем будет обрабатывать распределение входящих подключений к нескольким слушателям. Преимущество этого состоит в том, что вашему приложению не нужно обрабатывать мультиплексирование самих соединений, и вместо этого он может просто беспокоиться об обработке соединений, что, в свою очередь, дает вам быстрый и очень простой в реализации механизм, позволяющий параллелизм в вашем сетевом коде.

В Linux опция сокета для этого называется SO_REUSEPORT , и многие широко используемые высокопроизводительные серверные программы (включая такие, как Apache HTTPD и nginx) поддерживают его использование.

Windows, потому что она использует в основном прямой клон сетевого кода 4.4BSD, имеет ту же концепцию опций сокетов и имеет свои собственные опции для управления этим. Согласно этому ответу StackOverflow, рассматриваемая опция называется SO_REUSEADDR , и существует эквивалентная анти-опция SO_EXCLUSIVEADDRUSE .

Стоит отметить, что ничто не мешает нескольким различным программам использовать эту опцию и привязывать к одному и тому же порту. Это может привести к всевозможным головным болям при отладке сетевых проблем, а также является довольно значительным соображением безопасности.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .