这个问题用Ada标记,因为我需要在Ada中编码。但是,这个问题与语言无关。
我处于这种网络配置状态。这是给定的约束,现在无法更改。
我需要编写一个在192.168.0.1
上运行的软件,它能够从一个或另一个接收数据。
到目前为止我尝试了什么:
这不起作用。我得到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?。所以我试图切换到“任何”。
这有效,我可以听任何人,但我不知道谁在跟我说话。 对于小型测试,它可以工作。 但是当我有第二个发射器时,我会遇到麻烦。
-- 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?)
答案 0 :(得分:1)
创建绑定到192.68.0.2 +端口的2个套接字。如果我想要192.68.0.3的其他2个套接字,则相同。
关闭,但没有雪茄。您不需要绑定,但将套接字连接到所需的源地址。