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

时间:2010-06-03 16:44:10

标签: c sockets udp

我的初始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:对等端口我新创建的套接字“”连接到“”?

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

我想看一个我正在尝试做的工作示例:) 或者暗示我做错了什么。

谢谢!

2 个答案:

答案 0 :(得分: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 :(得分:1)

UDP套接字上的

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

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