Это не абсолютное правило на всех системах UNIX. У некоторых есть расширения, которые позволяют нескольким процессам связываться с одним и тем же адресом и комбинацией портов, и ядро затем будет обрабатывать распределение входящих подключений к нескольким слушателям. Преимущество этого состоит в том, что вашему приложению не нужно обрабатывать мультиплексирование самих соединений, и вместо этого он может просто беспокоиться об обработке соединений, что, в свою очередь, дает вам быстрый и очень простой в реализации механизм, позволяющий параллелизм в вашем сетевом коде.
В Linux используется опция сокета для этого SO_REUSEPORT
, и многие широко используемые высокопроизводительные серверные программы (включая такие, как Apache HTTPD и nginx) поддерживают его использование.
Windows, потому что она использует в основном прямой клон сетевого кода 4.4BSD, имеет ту же концепцию опций сокетов и имеет свои собственные опции для управления этим. Согласно этому ответу StackOverflow, соответствующая опция там вызывается SO_REUSEADDR
, и существует эквивалентная «анти-опция» SO_EXCLUSIVEADDRUSE
.
Стоит отметить, что ничто не мешает нескольким различным программам использовать эту опцию и привязывать к одному и тому же порту. Это может привести к всевозможным головным болям при отладке сетевых проблем, а также является довольно значительным соображением безопасности.