ADA 的socket通讯程式及解释
Author: misty (qibing83@yahoo.com.cn)
本程序使用GNAT.Sockets编写,参考GNAT中的g-socket.ads文件的注释。包括server端和client的程序:其中client循环向server端发送”hello world”字符串,server端循环接收4次并打印出来接收到的字符串,当接收完4次后关闭socket通道并退出。
|
--file server.adb, this program receive the message from client
with Ada.Text_IO; use Ada.Text_IO;
with GNAT.Sockets; use GNAT.Sockets;
procedure Server is
Address : Sock_Addr_Type;
Socket : Socket_Type;
Server : Socket_Type;
Channel : Stream_Access;
begin
-- Create socket and listen input from client
Initialize;
Address.Addr := Addresses (Get_Host_By_Name (Host_Name), 1);
--Address.Addr := Inet_Addr("172.0.0.1");
Address.Port := 2543;
Create_Socket (Server);
Bind_Socket (Server, Address);
Listen_Socket (Server);
Accept_Socket (Server, Socket, Address);
-- A client has been accepted, get the stream connected to the socket
Channel := Stream (Socket);
for K in 1 .. 4 loop
declare
Message : String := String'Input (Channel);
begin
Address := Get_Address (Channel);
Ada.Text_IO.Put_Line (Message & " from " & Image (Address));
Ada.Text_IO.Put_Line (Message);
end;
end loop;
Close_Socket (Server);
Close_Socket (Socket);
end Server; |
|
--file client.adb, this program send a message to server
with Ada.Text_IO; use Ada.Text_IO;
with GNAT.Sockets; use GNAT.Sockets;
procedure Client is
Address : Sock_Addr_Type;
Socket : Socket_Type;
Channel : Stream_Access;
i : Integer := 1;
Message : string := "hello world";
begin
Initialize;
Address.Addr := Addresses (Get_Host_By_Name (Host_Name), 1);
--Address.Addr := Inet_Addr("172.0.0.1");
Address.Port := 2543;
Create_Socket (Socket);
Connect_Socket (Socket, Address);
-- Connected, use a stream connected to the socket
Channel := Stream (Socket);
loop
Put_Line ("(client) O1 size " & Integer'Image (i));
String'Output (Channel, Message);
delay 3.0;
i := i + 1;
exit when i = 3;
end loop;
Close_Socket(Socket);
end Client; |
Server.adb和client.adb分别编译为两个可执行文件,首先运行server.exe,再运行client.exe。
|
|