【问题标题】:how to bind/connect multiple UDP socket如何绑定/连接多个UDP套接字
【发布时间】:2011-02-27 10:07:29
【问题描述】:

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

当我第一次收到 epoll/kqueue 传入数据的通知时,我执行了 recvfrom() 并填写了一个名为 peer_name 的结构 sockaddr,其中包含对等信息 (ip:port)。

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

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

然后我使用 connect() 将我新创建的套接字连接到刚刚向我发送了一些东西的对等方。我在名为peer_name 的struct sockaddr 中有信息。

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

我希望只从我“连接到”的对等方接收 UDP 帧。

1/ netstat -a -p udp 是否应该向我显示我新创建的套接字“已连接到”的对等方的 IP:PORT ?

2/ 我可能做错了什么,因为在创建我的新套接字后,此套接字会接收所有传入的 UDP 数据包,这些数据包以我绑定的 IP:PORT 为目标,而不管源对等 IP:PORT 是什么。

我希望看到一个我正在尝试做的工作示例 :) 或任何关于我做错了什么的提示。

谢谢!

【问题讨论】:

    标签: c sockets udp


    【解决方案1】:
    UDP 套接字上的

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

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

    【讨论】:

    • 可以肯定的是,我说的是服务器端。想法是,新套接字将接收来自特定客户端的所有数据。所以这就是为什么我将我的新套接字连接()到源客户端 IP:PORT。作为 sockname 和 peername 的套接字。 sockname 是套接字绑定的 ADDR:PORT,peername 是套接字关联的 ADDR:PORT(使用 connect()),因此 send() 知道向谁发送数据。 getsockname(), getpeername().
    • @nicboul:是的。 Chris 指出的是,UDP 套接字上的connect() 通常仅在 client 端有用,其中单个套接字仅与一个对等方通信。这对服务器端没有帮助。
    • @Chris 我很挑剔,但我不确定我是否同意你的说法。我认为连接具有远程地址绑定的效果,因此您可以将该套接字上的流量限制为来自特定客户端的消息。我基于strace nc -4lu $((0x4444)),然后是grep 4444 /proc/net/udp(在不同的终端中),在收到第一条消息之前和之后。 nc 不会接受来自其他客户端的消息。
    • @Chris,我同意@nhed - 我写了一个简单的测试应用程序,connects 到第一个sockaddr 它从阻塞的recvfrom 调用中返回;从不同的套接字发起多个sendto 调用只会收到第一个套接字的数据
    【解决方案2】:

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

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

    但最重要的是,必须连接 UDP 套接字才能接收 ICMP 错误。聚丙烯。 “TCP/IP 图解,第 2 卷”的 748-749 给出了关于为什么会这样的所有血淋淋的细节。”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      相关资源
      最近更新 更多