Получить случайный порт для сокета UDP - PullRequest
12 голосов
/ 13 января 2012

Мне нужно создать программу, которая будет взаимодействовать с другими программами на том же компьютере через UDP-сокеты. Он будет читать команды из stdin, а некоторые из этих команд заставят его отправлять / получать пакеты без остановки выполнения. Я прочитал некоторую информацию там, но так как я не знаком с программированием сокетов и должен быстро это сделать, у меня есть следующие вопросы:

  1. Мне нужно получить случайный неиспользуемый порт для прослушивания программы и зарезервировать его, чтобы другие программы могли взаимодействовать с ним, а также этот порт не был зарезервирован другой программой. Мне также нужно сохранить номер порта в переменной для будущего использования.
  2. Поскольку связь происходит между процессами на одной машине, мне интересно, могу ли я использовать PF_LOCAL.

Также приветствуется пример кода установки такого сокета, а также пример отправки / получения символьных строк.

Ответы [ 3 ]

21 голосов
/ 13 января 2012

Call bind() с указанием порта 0. Это позволит ОС выбирать неиспользуемый порт.Затем вы можете использовать getsockname() для восстановления выбранного порта.

1 голос
/ 01 августа 2012

Ответ Реми Лебо хорош, если вам нужен временный порт. Это не очень хорошо, если вам нужен постоянный зарезервированный порт, потому что другое программное обеспечение также использует тот же метод для получения порта (включая стек TCP ОС, которому нужен новый временный порт для каждого соединения).

Так может произойти следующее:

  1. Вы вызываете bind с 0 и getsockname (), чтобы получить порт;
  2. затем сохраните его в конфигурации (или в нескольких конфигах) для использования в будущем;
  3. Программное обеспечение, которому нужен этот порт, запускается и связывает порт.

Тогда вам нужно, например, перезапустите программное обеспечение:

  1. программное обеспечение останавливает и отменяет привязку порта: теперь порт можно вернуть через bind (0) и getsockname () снова;
  2. например. Стеку TCP нужен порт и он привязывает ваш порт;
  3. Программное обеспечение не может запуститься, потому что порт уже связан.

Таким образом, для «будущего использования» вам нужен порт, который не находится в эфемерном диапазоне портов (это диапазон, из которого bind (host, 0) возвращает порт).

Мое решение для этой проблемы - утилита командной строки port-for .

0 голосов
/ 13 января 2012

Если это действительно случайный порт, вы должны сделать что-то вроде:

srand(time(NULL));
rand() % NUM_PORTS; // NUM_PORTS isn't a system #define

Затем укажите этот порт в bind. Если это не удастся, выберите новый (не нужно повторно запускать генератор случайных чисел. Если случайный порт не важен, посмотрите на ответ Реми Лебо.

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