2015-03-08 2 views
1

С connect(int socket, const struct sockaddr *address, socklen_t address_len);, согласно man 2 connect:Может ли локальный порт использоваться для подключения к нескольким удаленным одноранговым узлам через UDP?

Параметр сокета является сокет. Если он имеет тип SOCK_DGRAM, этот вызов указывает одноранговую сеть, с которой сокет должен быть связан; этот адрес таков, на который должны быть отправлены датаграммы , и единственный адрес, из которого должны быть получены датаграммы .

Означает ли это, что локальный порт все еще может использоваться для подключения к нескольким удаленным аналогам через UDP? Или один локальный порт может использоваться только для подключения к одному партнеру?

Благодаря

ответ

1

Если вы звоните подключения() на сокет UDP, то вы можете использовать его только для отправки и получения пакетов/с адреса вы прошли, чтобы подключиться().

Однако, если вы не вызываете connect() в соке UDP, вы можете использовать sendto() и recvfrom() для отправки/получения пакетов в/из нескольких получателей, используя только один сокет.

+0

Почему это так? Что добавляет 'connect()' делать так, что ему нужно заблокировать конкретный одноранговый узел? – Kar

+0

Это как раз то, как это работает - в соке UDP, все connect() делает поле в структуре данных ядра в ядре, которое сообщает ядру отклонить любые входящие пакеты, которые не помечены как исходящие от этого IP-адреса, и отправить пакет на этот IP-адрес, когда send() вызывается в сокете. Что касается того, почему это было реализовано именно так, я могу только догадываться - вероятно, это была попытка разрешить один и тот же код (который вызывает send() и recv()) для работы как можно ближе для сокета TCP или UDP. –

+0

@Kate UDP - протокол без установления соединения. Сокеты api пытаются быть «полезными» и имитировать соединение. 'Connect()' api, используемый в гнезде UDP, является IMHO мерзостью. Это обманывает вас, верить в то, что не соответствует действительности. –

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