Привязка сокета UDP клиента

Я создаю сокет UDP для клиента UDP и отправляю пакеты UDP с разными номерами портов и жду ответа от пункта назначения в течение определенного периода времени.

Я сомневаюсь... Можно ли повторно привязать сокет UDP к нескольким номерам портов (даже IP-адресам) к одному и тому же сокету FD, не закрывая сокет?? (Я не могу использовать RAW сокеты:()

EDIT1: я пытался связать два разных дескриптора файла сокета с одинаковыми IP-адресом и номером порта, но я смешал результаты.. (Для обоих дескрипторов файла сокета я устанавливаю опцию SO_REUSEADDR).

В ядре Linux 2.6.8

First Socket FD - связывается успешно.

Second Socket FD: возвращает ошибку 98 о том, что адрес уже используется.

В Linux Kernel 2.6.24

Первый разъем FD: успешно связывается

Second Socket FD: связывается успешно

3 ответа

Я сомневаюсь... Можно ли повторно привязать сокет UDP к нескольким номерам портов (даже IP-адресам) к одному и тому же сокету FD, не закрывая сокет??

Похоже, что POSIX теперь имеет это официально как неподдерживаемое, цитата: Функция bind() должна назначить адрес локального адреса сокета сокету, идентифицированному сокетом дескриптора, которому не назначен локальный адрес сокета.

В прошлом я слышал, что re-bind() был возможен на некоторых платформах, хотя лично я никогда не использовал это.

Есть ли лучшее решение, кроме этого???

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

Попробуйте использовать select() на группе открытых розеток.

Для этого вы можете использовать один сокет UDP-сокета на один порт для получения данных, а другой (привязанный к другому порту) для отправки.

Другие вопросы по тегам