Привязка сокета 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() для мультиплексирования ввода-вывода и обработки тайм-аута.
Для этого вы можете использовать один сокет UDP-сокета на один порт для получения данных, а другой (привязанный к другому порту) для отправки.