我的初始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:对等端口我新创建的套接字“”连接到“”?
我想看一个我正在尝试做的工作示例:) 或者暗示我做错了什么。
谢谢!
答案 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)
connect(2)只设置套接字的默认目标地址(如果使用 write(2)或<,将发送数据的位置在套接字上强>发送(2)。它没有其他效果 - 您仍然可以使用 sendto(2)或 sendmsg(2)将数据包发送到其他地址,您仍然可以看到从任何地址发送的数据包
所以在端口上打开一个新套接字没有任何意义 - 对于收到的每个数据包,你需要查看源地址,看看它是否来自你已经看过的地址(和因此属于该逻辑流)或者是新地址(新逻辑流)。