连接的udp组播需要在发送方端绑定

时间:2012-10-22 13:25:11

标签: c linux network-programming

我有一个模棱两可的问题,我在两个用户之间有一个多播组,其中一个是发送者而另一个是接收者我在每一方做了这些场景:

接收器:

  1. 创建一个udp套接字。
  2. 绑定到多播组地址
  3. 连接到发送方(connect(发送方IP))
  4. 加入多播组
  5. 来自组播组的recv。
  6. 发信人:

    1. 创建一个udp套接字。
    2. 发送到组播组。
    3. 在上面这种情况下,当发送方发送数据接收方无法接收但是如果我们通过tcpdump检查接收方,则从组播组接收到数据。 但如果接收方没有连接到发送方,则会收到数据。

      但实际上,如果我们让发送方在发送到组播组之前绑定到组播地址,并且接收方连接到发送方,因为上面的方案数据将被成功接收!!!! 我们在发送方添加绑定时的任何解释???

3 个答案:

答案 0 :(得分:2)

您可能希望connect(2)发送方的套接字到多播组以加快发送速度,但不要connect(2)接收方,因为它将其限制为单播(是的,它有点令人困惑,但是这是它的工作方式)。只需bind(2)接收者到组/端口,然后使用setsockopt(2) IP_ADD_MEMBERSHIP加入该组。

答案 1 :(得分:0)

没有“连接UDP多播”这样的东西。它是连接的还是多播的。完全删除connect()步骤。

答案 2 :(得分:0)

在接收方,bind()和connect()调用都做同样的事情:它们将给定的Internet套接字地址与给定的无连接套接字相关联。对于bind()呼叫 - 其中Internet套接字地址是多播组的地址 - 这意味着套接字仅接收目标地址为多播组的UDP数据包。对于connect()调用 - 其中Internet套接字地址是发送方的地址 - 这意味着套接字只接收目标地址是发送方的UDP数据包,这不是你的想。

connect()调用覆盖了bind()调用,导致没有收到数据包。

bind()呼叫替换为connect()呼叫到多播组,您仍应接收UDP数据包 - 或仅保留bind()呼叫。这是你的电话。