Обнаружение свободных портов - PullRequest
4 голосов
/ 23 июня 2011

Я написал серверное приложение на erlang и клиент на C #. Они общаются через 3 порта TCP. Номера портов жестко закодированы. Теперь я хотел бы сделать это динамически. Я впервые занимаюсь сетевым программированием, поэтому извините за неспособность использовать правильную терминологию: -D

Я хотел бы создать супервизор, который будет принимать TCP-соединение от клиента по ранее известному порту (скажем, 10000 или как-то еще), затем найти 3 свободных порта, запустить приложение сервера на этих 3 портах. и сообщите клиенту эти номера портов, чтобы клиент мог подключиться к серверу.

Моя конкретная проблема: как найти 3 порта, которые не используются? (уточнение: какой модуль: fun () использовать для поиска свободного порта?)

Моя общая проблема: я уверен, что такого рода вещи (один сервер выделяет порты и перенаправляет клиентов) является довольно распространенной проблемой сетевого программирования, и для этого должно быть множество (специфичных для erlang или общих) ресурсов, но У меня просто нет терминологии, чтобы погуглить.

Ответы [ 3 ]

13 голосов
/ 23 июня 2011

Согласно документации Erlang здесь , если аргумент Port для функции gen_tcp: listen / 2 равен 0, то ОС назначит любой доступный порт для сокета. Последнее можно затем получить с помощью inet: port / 1.

Поэтому вы можете сделать что-то вроде этого:

{ok, Listen} = gen_tcp:listen(0, [Options]),
Port = inet:port(Listen).
3 голосов
/ 23 июня 2011

на тот случай, если вы этого не знали - вам не нужно выделять новые порты для каждого клиента, вполне нормально, чтобы все клиенты подключались к одним и тем же портам

UPDATE:

если есть причина выделять новые порты для входящих клиентов, то это далеко за пределы вашей первой программы «Введение в сетевое программирование».

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

в отношении служебных данных процессора / портов - выделение портов и запуск сервера, который прослушивает этот порт, уже намного дороже, чем прием клиентов на тот же порт.

1 голос
/ 23 июня 2011

Вам нужно избегать общеизвестных портов, ftp, http, smtp и т. Д., Но я не думаю, что существует какой-либо основной список портов, которые использует другое программное обеспечение, которых вам следует избегать.Я думаю, что вам лучше всего выбрать диапазон портов, которые вы хотите использовать.Проверьте во время выполнения, если кто-то еще отвечает (использует порты) на номера, которые вы выбираете динамически, если не выдает его клиенту.

...