как связать/соединить несколько сокетов UDP

Мой начальный сокет UDP связывается с 127.0.0.1:9898.

В первый раз, когда я уведомляюсь относительно входящих данных epoll/kqueue, я делаю recvfrom (), и я заполняю структуру sockaddr названный peer_name это содержит информации об узлах (ip:port).

Затем я создаю новый сокет UPD с помощью сокета (),

затем я связываю () этот недавно созданный сокет к тому же ip:port (127.0.0.1:9898), чем мой исходный сокет.

затем я подключаю свой недавно созданный сокет с помощью подключения () коллеге, который просто отправил мне что-то. У меня есть информация в структуре sockaddr названный peer_name.

Я затем добавляю свой недавно созданный сокет в моем epoll/kqueue векторе и ожидаю уведомления.

Я ожидал бы ТОЛЬКО получать кадр UDP от коллеги, с которым я ""подключен"".

1/делает netstat -a -p udp предполагают, чтобы показать мне IP:PORT однорангового узла, с которым ""подключен мой недавно созданный сокет""?

2/я, вероятно, делаю что-то не так, так как после создания моего нового сокета, этот сокет получает все входящие пакеты UDP destinated к IP:PORT, с которым я связываюсь, независимо от источника взаимодействуют с IP:PORT.

Я хотел бы видеть рабочий пример того, что я пытаюсь сделать :) или любая подсказка на том, что я делаю неправильно.

спасибо!

5
задан nicboul 3 June 2010 в 16:44
поделиться

1 ответ

connect(2) на UDP-сокете просто устанавливает адрес назначения по умолчанию сокета (куда будут отправлены данные, если вы используете write(2) или send(2) на сокете). Это не имеет никакого другого эффекта - вы все еще можете отправлять пакеты на другие адреса с помощью sendto(2) или sendmsg(2), и вы по-прежнему будете видеть пакеты, отправленные с любого адреса.

Таким образом, на самом деле нет смысла открывать новый сокет на порту - для каждого полученного пакета вам нужно посмотреть на исходный адрес, чтобы увидеть, исходит ли он от адреса, который вы уже видели (и, следовательно, принадлежит этому логическому потоку) или является новым адресом (новый логический поток).

1
ответ дан 14 December 2019 в 19:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: