Привязка сокета UDP клиента - PullRequest
0 голосов
/ 15 июля 2010

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

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

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

В ядре Linux 2.6.8

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

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

В ядре Linux 2.6.24

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

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

Ответы [ 3 ]

1 голос
/ 15 июля 2010

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

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

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

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

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

0 голосов
/ 15 июля 2010

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

0 голосов
/ 15 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...