2016-11-15 11 views
1

Я работаю над UDP-коммуникациями с помощью Ada. Этот код должен отправить некоторые данные другому хосту, который будет обрабатывать его. Я пытаюсь отправить начальное сообщение, чтобы начать общение, но оно не работает. Мой код клиента заключается в следующем:Как создать клиент UDP в Ada

with GNAT.Sockets; 
use GNAT.Sockets; 
with Ada.Text_IO; 
with Ada.Exceptions; 
use Ada.Exceptions; 
procedure Client_Send is 

task Send is 
    entry Start; 
    entry Stop; 
end Send; 

task body Send is 
    Address : Sock_Addr_Type; 
    Socket : Socket_Type; 
    Channel : Stream_Access; 

begin 
    accept Start; 

    -- See comments in Ping section for the first steps. 

    Address.Addr := Inet_Addr("192.168.0.1"); 
    Address.Port := 7777; 
    Create_Socket (Socket,Family_Inet,Socket_Datagram); 
    Bind_Socket (Socket, Address); 

    Channel := Stream (Socket); 

    String'Output (Channel, "Hello world"); 
    Free(Channel); 

    Ada.Text_IO.Put_Line ("Mesnaje Enviado"); 
    Close_Socket (Socket); 
    accept Stop; 

exception when E : others => 
    Ada.Text_IO.Put_Line 
     (Exception_Name (E) & ": " & Exception_Message (E)); 
end Send; 

    begin 
    Initialize (Process_Blocking_IO => False); 
    Send.Start; 
    Send.Stop; 
    Finalize; 
    end Client_Send; 

Я использую Wireshark для просмотра входящего трафика, но он ничего не получает.

+1

Развернуть по теме "не работает ». Я не понимаю, «используя Wireshark для получения сокета». –

+0

Я использую Wireshark для захвата всех пакетов, которые получает моя сеть. Поскольку я не получаю ничего от этого, когда я выполняю клиент, я предполагаю, что он не отправляет его должным образом. –

ответ

1

Есть (по крайней мере) две проблемы с вашей программой:

  1. Вы путаете UDP и TCP. UDP: не протокол, ориентированный на поток , поэтому вы не должны рассматривать его как поток Ada.
  2. Вы не настраиваете соединение с другим устройством.

Вот пример программы обмена данными по UDP: https://bitbucket.org/sparre/udp-chat

1

Вот простой UDP клиент/сервер в Аде с комара Sockets:

Клиент:

with Ada.Streams; 
with Ada.Text_IO; 

with GNAT.Sockets; 

procedure UDP_Client is 
    use GNAT.Sockets; 
    Address : Sock_Addr_Type; 
    Socket : Socket_Type; 
    Data : constant Ada.Streams.Stream_Element_Array (1 .. 512) := (others => 42); 
    Last : Ada.Streams.Stream_Element_Offset; 
begin 
    Address.Port := 50001; 
    Address.Addr := Inet_Addr ("127.0.0.1"); 
    Create_Socket (Socket, Family_Inet, Socket_Datagram); 
    Send_Socket (Socket, Data, Last, Address); 
    Ada.Text_IO.Put_Line ("last :" & Last'Img); 
end UDP_Client; 

сервера :

with Ada.Streams; 
with Ada.Text_IO; 

with GNAT.Sockets; 

procedure UDP_Server is 
    use GNAT.Sockets; 
    Server : Socket_Type; 
    Address, From : Sock_Addr_Type; 
    Data : Ada.Streams.Stream_Element_Array (1 .. 512); 
    Last : Ada.Streams.Stream_Element_Offset; 
    Watchdog : Natural := 0; 
begin 
    Create_Socket (Server, Family_Inet, Socket_Datagram); 
    Set_Socket_Option 
    (Server, 
     Socket_Level, 
     (Reuse_Address, True)); 
    Set_Socket_Option 
    (Server, 
     Socket_Level, 
     (Receive_Timeout, 
     Timeout => 1.0)); 
    Address.Addr := Any_Inet_Addr; 
    Address.Port := 50001; 
    Bind_Socket (Server, Address); 
    loop 
     begin 
     GNAT.Sockets.Receive_Socket (Server, Data, Last, From); 
     Ada.Text_IO.Put_Line ("last : " & Last'Img); 
     Ada.Text_IO.Put_Line ("from : " & Image (From.Addr)); 
     exception 
     when Socket_Error => 
      Watchdog := Watchdog + 1; 
      exit when Watchdog = 10; 
     end; 
    end loop; 
end UDP_Server; 
+0

Чтобы сделать то же самое для TCP, мне просто нужно изменить Socket_Datagram (в клиенте и сервере) на Socket_Stream? – gp443