2016-02-28 2 views
1

Я пытаюсь реализовать одноранговое чат-приложение с использованием UDP, и мне было интересно, как масштабировать программу для нескольких пользователей.Настройка нескольких сокетов UDP на одном порту

Как я понимаю, UDP требует только одного сокета для отправки и получения данных с использованием функций recvfrom и sendto. Используя данные из полей адресов, переданных этим функциям, я могу определить, с кем я общаюсь.

Мне было интересно, могу ли я создать несколько сокетов UDP на одном и том же порту для каждого однорангового узла, с которым я разговариваю. Таким образом, если данные поступают от однорангового узла X, данные поступают на порт UDP и передаются соответствующему сокету, который «привязан» к адресу X.

В любом случае, я мог бы это сделать, используя UDP?

+1

@ close-voter (s) Отойдите. Не зная ответа! = «Слишком широкий». – EJP

ответ

3

Да, вы можете указать SO_REUSEADDR (SO_REUSEPORT на Linux) перед привязкой сокета UDP (всех розетки, включая первый), а затем подключить каждый разъем к соответствующей цели, но это действительно не нужно. Просто отправляйте каждое сообщение, поступающее в один сокет в соответствии с его адресом-источником.

+0

Таким образом, использование SO_REUSEPORT гарантирует, что датаграммы из X будут отправляться в сокет X, а датаграммы из Y будут отправляться в сокет Y, которые оба находятся на одном и том же порту? –

+0

Нет, подключение сокета к X или Y делает это. SO_REUSEPORT позволяет вам, ошибочно, повторно использовать порт. – EJP

+0

Так что я должен использовать 'connect' ... Хм ... Я как бы понимаю, что вы говорите ... Что я действительно хотел сделать, это взять все эти сокеты и поместить их в хороший цикл выбора , поэтому я могу читать от каждого партнера, когда они будут готовы. Я также чувствую, что опция выбора поможет с тайм-аутами. Мысли, Mr.EJP? –

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