如何在 Ada 中创建 UDP 客户端

How to Create an UDP client in Ada

我正在使用 Ada 进行 UDP 通信。此代码必须将一些数据发送到另一台将要处理它的主机。我正在尝试发送初始消息以开始通信,但它不起作用。我的客户端代码如下:

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. 您混淆了 UDP 和 TCP。 UDP 不是面向流的 协议,因此您不应将其视为 Ada 流。
  2. 您没有与另一台机器建立连接。

下面是一个通过 UDP 通信的程序示例:https://bitbucket.org/sparre/udp-chat

这是一个使用 GNAT 套接字的简单 UDP 客户端/服务器:

客户:

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;