首页 文章

如何绑定/连接多个UDP套接字

提问于
浏览
5

我的初始UDP套接字绑定到127.0.0.1:9898 .

我第一次通过epoll / kqueue收到传入数据的通知时,我做recvfrom()并填写一个名为 peer_name 的struct sockaddr,其中包含对等信息(ip:port) .

然后我使用socket()创建一个新的UPD套接字,

然后我将这个新创建的套接字绑定到与原始套接字相同的ip:port(127.0.0.1:9898) .

然后我使用connect()将我新创建的套接字连接到刚发给我东西的同伴 . 我在struct sockaddr中有一些名为 peer_name 的信息 .

然后我在epoll / kqueue向量中添加我新创建的套接字并等待通知 .

我希望只能从对等端接收UDP帧“”连接到“” .

1 /是 netstat -a -p udp 假设显示IP:我新创建的套接字的对等端口是“"connected to"”?

2 /我可能做错了,因为在创建新套接字后,这个套接字会接收所有传入UDP的数据包:PORT我被绑定到,无论源对等IP:PORT .

我想看看我正在尝试做什么的一个有效例子:)或任何暗示我做错了什么 .

谢谢!

2 回答

  • 4

    http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-5.html

    “执行connect()调用会影响套接字的接收行为吗?是的,有两种方式 . 首先,只返回来自”连接对等体“的数据报 . 所有其他到达您端口的数据报都不会传递给您 .

    但最重要的是,必须连接UDP套接字才能接收ICMP错误 . PP . “TCP / IP Illustrated,第2卷”的第748-749页给出了为什么会出现这种情况的所有细节 . “

  • 1

    UDP套接字上的 connect(2) 只设置套接字的默认目标地址(如果在套接字上使用 write(2)send(2) ,将发送数据) . 它没有其他影响 - 您仍然可以使用 sendto(2)sendmsg(2) 将数据包发送到其他地址,您仍然可以看到从任何地址发送的数据包 .

    因此,在端口上打开一个新套接字并没有任何意义 - 对于收到的每个数据包,您需要查看源地址,看它是否来自您已经看过的地址(因此属于那个逻辑流)或者是一个新地址(一个新的逻辑流) .

相关问题