Найдите бесплатный TCP-порт с поддержкой ASIO

У меня есть основная программа C ++, которая вызывает два подпроцесса. Эти два подпроцесса связаны через порт TCP, назначенный основной программой.

Я вижу случай использования свободного порта для поиска свободного порта: программа будет пытаться выполнить привязку к указанному порту, и если возвращается «сбой», укажите порт ++ и повторите попытку.

Хотя для моего случая мне нужно решить в моей основной программе, какой номер порта будет передаваться этим двум подпроцессам.

Так есть ли простой способ проверить, можно ли использовать порт, не пытаясь привязать к нему?

подобно

port = 1234
while(port < 1299)
if(port is bindable)
call to subprocesses
break;
else
port++

-2

Решение

правильный Чтобы найти свободный порт, нужно, чтобы ОС выбрала для вас доступный порт. Создайте сокет и свяжите его с портом 0, затем запросите сокет, чтобы выяснить, какой порт был фактически связан. Каждая основная ОС поддерживает эту функцию. Какой конкретный синтаксис для достижения этого в Boost ASIO, я понятия не имею.

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

  1. Заставьте основную программу создать и связать 2 сокета, а затем передать существующие сокеты подпроцессам для использования.

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

  3. Заставьте подпроцессы получать свои собственные порты (путем привязки к порту 0), а затем сообщать фактические номера портов обратно основной программе, которая затем может передавать их между подпроцессами по мере необходимости.

3

Другие решения

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

Нет, это не так. Я не знаю, где вы видели это, но обычный и правильный случай — указать нулевой порт и позволить операционной системе сделать это, а затем использовать getsockname() узнать, какой порт выделена ОС.

1

По вопросам рекламы [email protected]