2016-11-30 7 views
0

Я работаю над реализацией протокола протокола UDP.Вызов connect() несколько раз в UDP-сокете для отправки на другой целевой адрес - действительный?

У меня вопрос о вызове connect() для UDP.

Я хочу использовать connect() и send() вместо sendto(). Обычно конец приемника не изменяется. Однако при определенных обстоятельствах это может произойти. Действительно ли вы вызываете connect() в сокет UDP, который уже подключен для установки другой цели без закрытия и повторного открытия сокета (и тем самым теряя буферизованные принятые датаграммы)?

Я не нашел никакой документации, является ли это действительным или нет (поэтому тестирование может только сказать мне, если это произойдет, что может быть не переносимым). В настоящее время я работаю с winsock2 в Windows 7, но хочу быть переносимым в другие (более новые) версии Windows и linux.

ответ

1

По крайней мере, для Linux manpage (man 2 connect) говорит ОК: «Как правило, сокеты протокола на основе соединения могут успешно соединяться() только один раз; Сокеты без установления соединения могут использовать connect() несколько раз, чтобы изменить их связь. Соединители без сокета могут растворять asso- ciation, подключаясь к адресу с членом sa_family sockaddr, установленным в AF_UNSPEC (поддерживается на Linux с ядра 2.2). '

+0

Спасибо. Теперь мне просто нужно знать информацию о Windows :-) Или просто попробуйте, если это сработает и надеется, что поведение не изменится. –

+0

На самом деле, я нашел ответ для Windows, хотя похоже, что он реализован аналогично закрытию/повторному открытию сокета: «Для сокета без установления соединения (например, введите SOCK_DGRAM), [...]. Назначение по умолчанию можно изменить, просто вызвав соединение снова, даже если сокет уже подключен. Любые датаграммы, поставленные в очередь для получения, отбрасываются, если имя отличается от предыдущего соединения. ' –

 Смежные вопросы

  • Нет связанных вопросов^_^