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

nic*_*oul 5 c sockets udp

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

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

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

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

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

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

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

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

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

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

谢谢!

Chr*_*odd 1

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

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

  • @Chris,我同意@nhed - 我编写了一个简单的测试应用程序,它“connect”到它从阻塞“recvfrom”调用中返回的第一个“sockaddr”;从不同套接字发起多个“sendto”调用会导致仅收到第一个套接字的数据 (2认同)