взаимодействия connect () и dup () и epoll () для дескрипторов UDP - PullRequest
0 голосов
/ 09 января 2019

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

Мой вопрос о том, как это взаимодействует с epoll() при использовании дублирующего дескриптора из dup(). Это может относиться и к Linux.

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

Будет ли connect() задан по умолчанию равноправный адрес / порт только для дублированного дескриптора или он будет передаваться через дескриптор слушателя? То есть может ли каждый повторяющийся дескриптор быть уникальным по умолчанию?

Если это так, будет ли каждый дубликат дескриптора вести себя уникально для целей событий EPOLLIN? То есть будет ли входящая дейтаграмма вызывать EPOLLIN только для дубликата дескриптора, связанного с равноправным адресом / портом?

Возможно, мне нужно просто написать код и посмотреть, но сначала я хотел спросить, чтобы сэкономить усилия.


В справочной странице NetBSD для dup() специально указано ...

"... все режимы объектов, настройки, свойства и поведение, кроме флага close-on-exec, совместно используются ссылками. Это включает в себя настройку режима добавления, неблокирующие действия ввода-вывода, Выполняются асинхронные операции ввода-вывода, параметры сокетов и т. д. "

Так что я думаю, что мой ответ в том, что connect() на любом дублирующем дескрипторе будет одинаково влиять на дескриптор слушателя и на все остальные дублирующие дескрипторы.

...