Ответ 1
Вызовите sendto
без вызова bind
, сначала сокет будет связан автоматически (с бесплатным портом).
Мне нужно приложение, которое отправляет UDP-пакет на какой-либо сетевой сервер и получает ответ. Сервер отвечает на тот же номер порта, откуда пришел запрос, поэтому мне сначала нужно связать() мой сокет с любым номером порта UDP.
Жесткая кодировка номера порта UDP - это плохая идея, поскольку она может использоваться любым другим приложением, работающим на одном ПК.
Есть ли способ связать сокет UDP с любым доступным портом? IMO, он должен быть эффективным способом быстрого получения свободного порта #, который используется, например, accept().
Если нет, то какая лучшая стратегия попытаться привязать и проверить статус WSAEADDRINUSE/EADDRINUSE: попробуйте порты последовательно начиная с 1025 или 1025 + rand() или других?
Вызовите sendto
без вызова bind
, сначала сокет будет связан автоматически (с бесплатным портом).
Другой вариант - указать порт 0 на bind()
. Это позволит вам привязываться к определенному IP-адресу (если у вас несколько установленных), но при этом привязывается к случайному порту. Если вам нужно знать, какой порт был выбран, вы можете использовать getsockname()
после выполнения привязки.
Мне что-то не хватает, почему бы вам не использовать udp-сокет для отправки данных? Начните с sendto, а затем используйте функцию recvfrom для чтения входящих данных, и вы получите в качестве бонуса адрес, с которого были отправлены данные, прямо там, чтобы вы могли отправить ответ.