Обычно допускается только одно использование каждого сокета

803
baum

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

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

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

3
Я запутался, почему вы считаете сообщение об ошибке настолько точным. EBGreen 6 лет назад 1
да, я думаю, излишний оптимизм в Microsoft baum 6 лет назад 0

1 ответ на вопрос

3
Austin Hemmelgarn

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

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

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

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