2016-11-15 19 views
1

我正在使用Ada进行UDP通信。该代码必须将一些数据发送给另一个将要处理它的主机。我试图发送初始消息来开始通信,但它不起作用。我的客户代码如下:如何在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获取套接字”。 –

+0

我使用Wireshark捕获我的网络正在接收的所有数据包。由于我在执行客户端时没有收到任何内容,因此我认为它没有正确发送。 –

回答

1

有(至少)两个问题你的程序:

  1. 你混合了UDP和TCP。 UDP是而不是一个面向流的 协议,所以你不应该把它当作Ada流。
  2. 您未与另一台机器建立连接。

这里是一个程序的通信的UDP一个例子:https://bitbucket.org/sparre/udp-chat

1

下面是一个简单的UDP客户端/ Ada中与GNAT套接字服务器:

客户:

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