C++ 听“a”的步骤;“无连接UDP多播”;用C++;和Linux

C++ 听“a”的步骤;“无连接UDP多播”;用C++;和Linux,c++,linux,sockets,udp,multicast,C++,Linux,Sockets,Udp,Multicast,我必须收听“无连接UDP多播”。我有一个服务器的IP和端口。我没有任何其他信息。我如何做到这一点 我做了一些搜索,发现了一些提示: 服务器使用recvfrom()监听广播IP 客户端使用广播IP上的sendto()发送1个数据包以查询服务器 服务器从recvfrom()中的返回地址获取客户端的IP和端口 服务器从自己的IP和端口直接响应客户机 客户端从recvfrom()中的返回地址获取服务器的IP和端口 既然他们现在有了彼此的“直达线路”,正常的通信就可以开始了 我还读了一篇有用的文章。但是这

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

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

  • 服务器使用recvfrom()监听广播IP
  • 客户端使用广播IP上的sendto()发送1个数据包以查询服务器
  • 服务器从recvfrom()中的返回地址获取客户端的IP和端口
  • 服务器从自己的IP和端口直接响应客户机
  • 客户端从recvfrom()中的返回地址获取服务器的IP和端口
  • 既然他们现在有了彼此的“直达线路”,正常的通信就可以开始了
  • 我还读了一篇有用的文章。但是这篇文章是为
    winsockets
    写的。我知道这不应该对理论有太大的影响,但当涉及到实现时,我仍然很困惑。例如,您将看到,在许多地方,他们建议必须调用
    sendto()
    ,然后使用为
    recvfrom
    返回的
    sockaddr
    。然而,我不明白为什么有人建议这样做。我们还不知道地址和港口吗?这仅仅是为了避免手动填充结构,还是与
    sockaddr
    的其他参数有关

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

    SOCKET sUDPSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    
    这同样适用于linux吗?我在哪里可以找到这些信息

    我正在寻找关于这个问题的可靠参考资料。我在谷歌上搜索了不少,但找不到任何权威文章或博客在Linux上进行搜索

    你说

    我必须收听连接较少的UDP多播

    您在评论中阐明了问题的含义:

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

    那是不可能的。您的计算机接收多播流量的唯一方法是路由器将其转发给您,而路由器仅在存在多播订阅时才这样做。考虑另一种选择:即使没有订阅,每个路由器都应该转发多播包。但是,所有多播数据包都会被淹没在整个网络中,这将超过许多链路的可用带宽,有效地造成拒绝服务攻击


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

    IP广播与多播不同。你想要哪个?我不确定你所说的“无连接”是什么意思,但我发现:@drum connection less意味着我不必订阅任何多播组。@user3553031我想要一个udp连接少的多播。@Wildling在这种情况下,“无连接”的反义词是TCP。连接意味着维持一种状态,你是对的。我必须使用
    IPPROTO\u IP
    IP\u ADD\u MEMBERSHIP
    标志以及多播组地址调用
    setsockopt
    来接收数据