Ответ 1
Вызвать bind()
указать порт 0. Это позволит ОС выбрать неиспользуемый порт. Затем вы можете использовать getsockname()
для возврата выбранного порта.
Мне нужно создать программу, которая будет общаться с другими программами на том же компьютере через сокеты UDP. Он будет читать команды из stdin, и некоторые из этих команд заставят его отправлять/получать пакеты без остановки выполнения. Я прочитал некоторую информацию там, но так как я не знаком с программированием сокетов и мне нужно быстро это сделать, у меня есть следующие вопросы:
Также будет полезен пример кода для установки такого сокета, а также пример отправки/получения символов.
Вызвать bind()
указать порт 0. Это позволит ОС выбрать неиспользуемый порт. Затем вы можете использовать getsockname()
для возврата выбранного порта.
Ответ Remy Lebeau хорош, если вам нужен временный порт. Это не так хорошо, если вам нужен постоянный зарезервированный порт, потому что другое программное обеспечение также использует тот же метод для получения порта (включая стек стека ОС, которому нужен новый временный порт для каждого подключения).
Так может случиться следующее:
Тогда вам нужно, например, перезапустите программное обеспечение:
Итак, для "будущих применений" вам нужен порт, который не находится в эфемерном диапазоне портов (диапазон, из которого bind (host, 0) возвращает порт).
Мое решение для этой проблемы - port-for утилита командной строки.
Если это случайный порт действительно важен, вы должны сделать что-то вроде:
srand(time(NULL));
rand() % NUM_PORTS; // NUM_PORTS isn't a system #define
Затем укажите этот порт в bind. Если он терпит неудачу, выберите новый (нет необходимости повторно забирать случайный генератор. Если случайный порт не важен, посмотрите на ответ Реми Лебо.