0

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

接收者:

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

发件人:

  1. 创建一个 udp 套接字。
  2. 发送到多播组。

在上面的这种情况下,当发送方发送数据接收方无法接收但如果我们通过 tcpdump 检查接收方端,则从多播组接收到数据。但如果接收方没有连接到发送方,则会收到数据。

但是实际上,如果我们让发送者在发送到多播组之前绑定到多播地址,并且接收者也连接到发送方,如上述场景数据将被成功接收!!!!当我们在发送方添加绑定时有什么解释???

4

3 回答 3

2

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

于 2012-10-22T14:25:06.727 回答
0

没有“连接的 UDP 多播”之类的东西。它已连接或多播。完全删除 connect() 步骤。

于 2012-10-23T06:28:26.363 回答
0

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

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

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

于 2015-01-05T20:47:45.723 回答