Почему два отдельных процесса могут связывать () с одним и тем же портом TCP, но не могут одновременно прослушивать? - PullRequest
0 голосов
/ 04 сентября 2018

Простой файл кода C выглядит следующим образом:

fd = socket(...)
set_reuseaddr(...)
bind(fd, 6666,...)

Этот код может быть запущен двумя отдельными процессами на одном компьютере (Linux). Но когда я добавляю listen() в код, подобный этому:

fd = socket(...)
set_reuseaddr(...)
bind(fd, 6666,...)
listen(fd)

Второй процесс вызывает bind() с ошибкой.

Во-первых, я не нашел использования для двух отдельных процессов, которые bind() только для одного и того же порта и не вызывают listen().

Так что я запутался, почему реализация не может просто вернуть сбой, когда один процесс пытается привязать существующий порт, и почему он задерживается на listen()?

1 Ответ

0 голосов
/ 04 сентября 2018

Это поведение рассматривается на странице руководства, цитата:

   SO_REUSEADDR
          Indicates that the rules used in validating addresses supplied
          in a bind(2) call should allow reuse of local addresses.  For
          AF_INET sockets this means that a socket may bind, except when
          there is an active listening socket bound to the address.
          When the listening socket is bound to INADDR_ANY with a spe‐
          cific port then it is not possible to bind to this port for
          any local address.  Argument is an integer boolean flag.

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

Также, возможно, вы могли бы рассмотреть возможность использования SO_REUSEPORT для перераспределения accept () вызовов между рабочими процессами. Тем не менее, использование этого может заслуживать отдельного обсуждения.

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