2010-06-03 133 views
4

我的初始UDP套接字绑定到127.0.0.1:9898。如何绑定/连接多个UDP套接字

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

然后,我创建使用套接字()的新UPD插座,

然后我绑定()这个新创建的套接字连接到同一个IP:比我原来的插座端口(127.0.0.1:9898)。

然后我使用connect()将刚刚创建的套接字连接到刚刚发送给我的对象。我在struct sockaddr中获得了名为peer_name的信息。

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

我希望只接收来自对端的UDP帧“”连接到“”。

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

2 /我可能做错了,因为在创建我的新套接字后,此套接字接收所有到达IP绑定的IP:PORT端口的所有传入UDP数据包,而不考虑源对等IP:PORT。

我想看看我正在努力做的一个工作示例:) 或任何暗示我做错了什么。

谢谢!

回答

1

(2)连接在一个UDP套接字只是设置套接字的默认目标地址(数据会如果使用写入发送(2)发送(2)插槽上) 。它没有其他的影响 - 你仍然可以发送数据包到其他地址sendto(2)sendmsg(2),你仍然会看到从任何地址发送的数据包。

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

+0

可以肯定的是,我在谈论服务器端。这个想法是,新的套接字将接收来自特定客户端的所有数据。所以这就是为什么我连接()我的新套接字到源客户端IP:PORT。 套接字作为sockname和对等名称。sockname是套接字绑定到的ADDR:PORT,而peername是套接字关联的ADDR:PORT(使用connect()),因此send()知道发送数据的人。 getsockname(),getpeername()。 – nicboul 2010-06-03 18:02:03

+0

@nicboul:是的。 Chris指出的是,UDP套接字上的connect()通常只在* client端有用,其中一个套接字只与一个对等端进行通信。它在服务器端无用。 – caf 2010-06-04 02:21:10

+1

@克里斯我不会挑剔,但我不确定我是否同意你的发言。我认为连接具有remote-addr绑定的效果,因此您可以将该套接字上的流量限制为来自特定客户端的消息。我在收到第一条消息之前和之后,以'strace NC-4lu $((0x4444))'为后面跟着'grep 4444/proc/net/udp'(在不同的终端)。 'nc'不接受来自其他客户的消息。 – nhed 2012-02-02 17:58:36