Подтвердить что ты не робот

Как привязать к любому доступному порту?

Мне нужно приложение, которое отправляет UDP-пакет на какой-либо сетевой сервер и получает ответ. Сервер отвечает на тот же номер порта, откуда пришел запрос, поэтому мне сначала нужно связать() мой сокет с любым номером порта UDP.

Жесткая кодировка номера порта UDP - это плохая идея, поскольку она может использоваться любым другим приложением, работающим на одном ПК.

Есть ли способ связать сокет UDP с любым доступным портом? IMO, он должен быть эффективным способом быстрого получения свободного порта #, который используется, например, accept().

Если нет, то какая лучшая стратегия попытаться привязать и проверить статус WSAEADDRINUSE/EADDRINUSE: попробуйте порты последовательно начиная с 1025 или 1025 + rand() или других?

4b9b3361

Ответ 1

Вызовите sendto без вызова bind, сначала сокет будет связан автоматически (с бесплатным портом).

Ответ 2

Другой вариант - указать порт 0 на bind(). Это позволит вам привязываться к определенному IP-адресу (если у вас несколько установленных), но при этом привязывается к случайному порту. Если вам нужно знать, какой порт был выбран, вы можете использовать getsockname() после выполнения привязки.

Ответ 3

Мне что-то не хватает, почему бы вам не использовать udp-сокет для отправки данных? Начните с sendto, а затем используйте функцию recvfrom для чтения входящих данных, и вы получите в качестве бонуса адрес, с которого были отправлены данные, прямо там, чтобы вы могли отправить ответ.