监听"连接的步骤减去UDP多播"使用C ++和Linux

时间:2014-07-05 20:52:29

标签: c++ linux sockets udp multicast

我必须收听“无连接UDP多播”。我有一个服务器的IP和端口。我没有任何其他信息。我该如何做到这一点?

我做了一些搜索,发现了一些提示like

  1. 服务器使用recvfrom()来侦听广播IP。
  2. 客户端使用广播IP上的sendto()发送1个数据包来查询服务器。
  3. 服务器从recvfrom()
  4. 中的返回地址获取客户端的IP和端口
  5. 服务器将其自己的IP和端口直接响应给客户端。
  6. 客户端从recvfrom()
  7. 中的返回地址获取服务器的IP和端口
  8. 由于他们现在彼此的“直线”正常通信可以开始
  9. 我还阅读了this有用的文章。但这篇文章是针对winsockets的。我知道这不应该对理论产生很大的影响,在实现方面我仍然很困惑。例如,您会看到许多地方他们建议您必须致电sendto(),然后使用sockaddr返回的recvfrom。但是,我不明白为什么这是建议。我们不知道地址和端口吗?是否只是为了避免手工填充结构,还是与sockaddr的其他参数相关?

    此外,在同一篇文章中,他们在调用socket时使用以下标志IPPROTO_UDP

    SOCKET sUDPSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    

    这同样适用于linux吗?我在哪里可以找到这样的信息?

    我正在寻找关于这个问题的可靠参考。我搜索了很多,但在Linux上找不到任何权威文章或博客。

1 个答案:

答案 0 :(得分:2)

你说

  

我必须收听无连接UDP多播

在评论中,您澄清了问题的含义:

  

无连接意味着我不必订阅任何多播组

嗯,这是不可能的。您的计算机接收多播流量的唯一方法是让路由器将其转发给您,并且路由器仅在存在多播订阅时执行此操作。考虑替代方案:即使没有订阅,每个路由器都应转发组播数据包?但是,所有组播数据包都会在整个网络中泛滥,这将超过许多链路的可用带宽,从而有效地造成拒绝服务攻击。

如果您只想在本地网络上进行自动发现,则需要广播,而不是多播。使用与单播UDP相同的功能进行广播,不需要连接。但是,您必须使用SO_BROADCAST启用setsockopt选项。