UDP套接字:2个组播发射器,只想听1

时间:2017-04-10 09:55:40

标签: sockets udp broadcast ada

这个问题用Ada标记,因为我需要在Ada中编码。但是,这个问题与语言无关。

我处于这种网络配置状态。这是给定的约束,现在无法更改。

  • 192.168.0.2
    • 通过广播发布UDP:224.224.0.1
    • 在端口A和B上
  • 192.168.0.3
    • 使用广播发布UDP:224.224.0.2
    • 在端口A和B上

我需要编写一个在192.168.0.1上运行的软件,它能够从一个或另一个接收数据。

到目前为止我尝试了什么:

  • 创建绑定到192.68.0.2 +端口的2个套接字。如果我想要192.68.0.3的其他2个插槽,则相同。

这不起作用。我得到socket error 10049 can't assign address(请参阅https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668%28v=vs.85%29.aspx

我读过这个:What does it mean to bind a multicast (UDP) socket?。所以我试图切换到“任何”。

  • 创建绑定到Any +相关端口(A和B)的2个套接字

这有效,我可以听任何人,但我不知道谁在跟我说话。 对于小型测试,它可以工作。 但是当我有第二个发射器时,我会遇到麻烦。

-- emitter uses multicast
GNAT.Sockets.Set_Socket_Option (Socket => socket_data.Socket,
                              Level  => GNAT.Sockets.IP_Protocol_For_IP_Level,
                              Option => (Name              => GNAT.Sockets.Add_Membership,
                                         Multicast_Address => GNAT.Sockets.Inet_Addr (SERVER_MULTICAST_EMISSION_IP),
                                         Local_Interface   => GNAT.Sockets.Any_Inet_Addr));
Print ("Configure Receive socket - IP_Protocol_For_IP_Level Multicast_Address OK");

GNAT.Sockets.Set_Socket_Option (socket_data.Socket,
                              GNAT.Sockets.IP_Protocol_For_IP_Level,
                              (GNAT.Sockets.Multicast_Loop, True));
Print ("Configure Receive socket - IP_Protocol_For_IP_Level Multicast_Loop OK");

GNAT.Sockets.Set_Socket_Option (Socket => socket_data.Socket,
                              Option => (Name    => GNAT.Sockets.Receive_Timeout,
                                         Timeout => GNAT.Sockets.Timeval_Duration (0.03)));
Print ("Configure Receive socket - timeout OK");

-- bind to address+port
GNAT.Sockets.Bind_Socket (Socket  => socket_data.Socket,
                        Address => socket_data.Bound_To_Address);

我的问题很简单:

  • 我觉得我的问题有问题:在同一个端口上播放2个发射器会使接收端的过滤有点......棘手

  • 在我的机器192.168.0.1上,为什么我不能创建套接字192.168.0.2:A/192.168.0.2:B并绑定到它?

  • 如果我坚持使用“任何”解决方案,我如何配置/编程我的套接字来过滤掉发射器IP?

(如上所述,我已经阅读了套接字上的参考答案 What does it mean to bind a multicast (UDP) socket?Socket options SO_REUSEADDR and SO_REUSEPORT, how do they differ? Do they mean the same across all major operating systems?

1 个答案:

答案 0 :(得分:1)

  

创建绑定到192.68.0.2 +端口的2个套接字。如果我想要192.68.0.3的其他2个套接字,则相同。

关闭,但没有雪茄。您不需要绑定,但套接字连接到所需的源地址。