如何在Ada中创建一个UDP客户端

3

我正在使用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
详细说明一下“不起作用”的具体表现。我不理解“使用Wireshark获取套接字”的意思。 - Simon Wright
我正在使用Wireshark捕获我的网络接收到的所有数据包。由于当我执行客户端时没有收到任何内容,因此我认为它没有正确发送。 - eps_712
2个回答

4
这里是使用GNAT Sockets编写的Ada语言简单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;

为了在TCP中做同样的事情,我只需要将客户端和服务器中的Socket_Datagram更改为Socket_Stream吗? - gp443

3
你的程序存在(至少)两个问题:
  1. 你混淆了UDP和TCP。UDP不是面向流的协议,因此你不应该将其视为Ada流。
  2. 你没有与另一台机器建立连接。
这里有一个使用UDP通信的示例程序:https://bitbucket.org/sparre/udp-chat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接