如何在 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 查看入站流量,但它没有收到任何信息。
你的程序有(至少)两个问题:
- 您混淆了 UDP 和 TCP。 UDP 不是面向流的
协议,因此您不应将其视为 Ada 流。
- 您没有与另一台机器建立连接。
下面是一个通过 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;
我正在使用 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 查看入站流量,但它没有收到任何信息。
你的程序有(至少)两个问题:
- 您混淆了 UDP 和 TCP。 UDP 不是面向流的 协议,因此您不应将其视为 Ada 流。
- 您没有与另一台机器建立连接。
下面是一个通过 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;