Можно ли повторно использовать номера портов TCP в Linux - PullRequest
2 голосов
/ 11 мая 2011

Можно ли повторно использовать прослушиваемый порт TCP в linux в разных процессах?

, например, процесс A и процесс B прослушивают на сервере = INADDR_ANY и порт = 10000

, если еготогда невозможно, как http-сервер apache может прослушивать порт № 80 в другом процессе.

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 17 мая 2011

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

Единственный способ это организовать:чтобы создать сокет, bind() и вызовите listen(), затем продублируйте его.Вы можете продублировать сокет следующим образом:

  • , вызвав fork() - оба дочерних процесса унаследуют слушающий сокет.Это то, что делает Apache;или
  • отправка дескриптора в прослушивающий сокет через соединение сокетов домена UNIX с использованием сообщения SCM_RIGHTS.
0 голосов
/ 11 мая 2011

2 процесса могут прослушивать один и тот же порт. Они оба будут вызывать «Принять», и только один получит «Принять», возвращенный с первым клиентом.

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

Если вы хотите сделать это из не связанных процессов, флаг SO_REUSEPORT позволяет нескольким процессам связываться с одним и тем же адресом, если все они используют опцию SO_REUSEPORT.

ссылка

0 голосов
/ 11 мая 2011

Apache порождает подпроцессы, которые наследуют файловые дескрипторы.Но эти подпроцессы на самом деле не прослушивают порт сервера (80), а выполняют взаимодействие с клиентами на разных портах, открытых после установления соединения.

2 процесса не могут прослушивать 1 порт TCP.Как они будут делиться входящими данными?

...