Я экспериментирую с многоадресной рассылкой IP-адресов в Ada, но, похоже, не получаю трафик, отправленный в группу многоадресной рассылки.Почему-то кажется, что я не могу заставить приложение извлекать входящие пакеты.
Я могу проверить (используя Wireshark), что многоадресное соединение отправлено с моего компьютера, а также я могу убедиться, что данные отправляютсяв группу многоадресной рассылки.
Я могу убедиться, что в ОС зарегистрировано многоадресное соединение, зарегистрированное с помощью команды netsh:
netsh interfaces ip show joins
Моя группа отображается со ссылкой 1, если я запускаю свою программу и0, если это не так.
Следующая процедура показывает моего слушателя, и я вызываю его, используя Mcast_IP => "239.255.128.128"
и Mcast_Port => "8807"
:
procedure Receive_Multicast (Mcast_IP : in String;
Mcast_Port : in String)
is
use GS;
use type Ada.Streams.Stream_Element_Offset;
Socket : GS.Socket_Type;
Address : GS.Sock_Addr_Type;
Data : AS.Stream_Element_Array (1 .. 2**16);
Offset : AS.Stream_Element_Offset;
Sender : GS.Sock_Addr_Type;
begin
Address.Addr := Any_Inet_Addr;
Address.Port := Port_Type'Value (Mcast_Port);
Create_Socket (Socket => Socket,
Family => Family_Inet,
Mode => Socket_Datagram);
Bind_Socket (Socket, Address);
-- Set socket options
Set_Socket_Option (Socket,
Socket_Level,
(Reuse_Address, True));
Set_Socket_Option
(Socket,
IP_Protocol_For_IP_Level,
(Multicast_TTL, 1));
Set_Socket_Option
(Socket,
IP_Protocol_For_IP_Level,
(Multicast_Loop, True));
Set_Socket_Option
(Socket,
IP_Protocol_For_IP_Level,
(Add_Membership, Inet_Addr (Mcast_IP), Any_Inet_Addr));
Tio.Put_Line ("Listening for MULTICASTS on port " & Address.Port'Img);
-- Receive the packet from the socket.
loop
Tio.Put_Line ("Waiting for incoming packets...");
Receive_Socket (Socket => Socket,
Item => Data,
Last => Offset,
From => Sender);
Tio.Put_Line ("Received " & Offset'Img & " bytes.");
end loop;
end Receive_Multicast;
Процедура продолжается вплоть до Receive_Socket
вызов (это процедура в пакете GNAT.Sockets
).Однако даже если я могу подтвердить многоадресный трафик с помощью Wireshark, вызов Receive_Socket
продолжает блокироваться.