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

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

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

РЕДАКТИРОВАТЬ1: Я попытался связать два разных файловых дескриптора сокета с одинаковыми IP-адресом и номером порта, но получил смешанные результаты ... (Для обоих файловых дескрипторов сокета я устанавливаю параметр SO_REUSEADDR).

В ядре Linux 2.6.8

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

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

В ядре Linux 2.6.24

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

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


person codingfreak    schedule 15.07.2010    source источник


Ответы (3)


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

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

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

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

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

person Dummy00001    schedule 15.07.2010

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

person Borealid    schedule 15.07.2010
comment
Хм, select () можно использовать только для нескольких открытых сокетов, но не для одного SOCKET FD :( - person codingfreak; 15.07.2010
comment
@codingfreak: каждый прослушивающий сокет требует своего собственного FD. Откройте по одному сокету для каждой пары порт / адрес, которую вы слушаете. Затем select в цикле, чтобы найти следующего для чтения. - person Borealid; 15.07.2010
comment
@codingfreak: вполне нормально использовать select() только на одном сокете fd. - person che; 15.07.2010

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

person che    schedule 15.07.2010
comment
В моем случае это не лучшее решение ... поскольку я должен отправлять и получать данные в одном сокете ... кажется, select () действительно поможет мне. - person codingfreak; 21.07.2010