С connect(int socket, const struct sockaddr *address, socklen_t address_len);
, согласно man 2 connect
:Может ли локальный порт использоваться для подключения к нескольким удаленным одноранговым узлам через UDP?
Параметр сокета является сокет. Если он имеет тип SOCK_DGRAM, этот вызов указывает одноранговую сеть, с которой сокет должен быть связан; этот адрес таков, на который должны быть отправлены датаграммы , и единственный адрес, из которого должны быть получены датаграммы .
Означает ли это, что локальный порт все еще может использоваться для подключения к нескольким удаленным аналогам через UDP? Или один локальный порт может использоваться только для подключения к одному партнеру?
Благодаря
Почему это так? Что добавляет 'connect()' делать так, что ему нужно заблокировать конкретный одноранговый узел? – Kar
Это как раз то, как это работает - в соке UDP, все connect() делает поле в структуре данных ядра в ядре, которое сообщает ядру отклонить любые входящие пакеты, которые не помечены как исходящие от этого IP-адреса, и отправить пакет на этот IP-адрес, когда send() вызывается в сокете. Что касается того, почему это было реализовано именно так, я могу только догадываться - вероятно, это была попытка разрешить один и тот же код (который вызывает send() и recv()) для работы как можно ближе для сокета TCP или UDP. –
@Kate UDP - протокол без установления соединения. Сокеты api пытаются быть «полезными» и имитировать соединение. 'Connect()' api, используемый в гнезде UDP, является IMHO мерзостью. Это обманывает вас, верить в то, что не соответствует действительности. –