Files
aws/workspace/sbreak.adb
Pascal Obry 5bf233b8e3 Repository clean-up.
Remove all unneeded svn:executable properties.
Remove the eol-style property on testme25.out for proper handling of
non standard EOL.
2006-09-13 09:20:27 +00:00

105 lines
2.3 KiB
Ada

-- Test break socket operation by close.
with Ada.Exceptions;
with Ada.Streams;
with Ada.Text_IO;
with GNAT.Sockets;
procedure SBreak is
use GNAT;
Server : Sockets.Socket_Type;
Peer : Sockets.Socket_Type;
Address : Sockets.Sock_Addr_Type;
Port : constant := 8800;
Count : Natural := 0;
Indicator : array (0 .. 3) of Character := "|/-\";
task Client is
entry Start;
entry Sent;
end Client;
task body Client is
Socket : Sockets.Socket_Type;
Address : Sockets.Sock_Addr_Type;
Last : Ada.Streams.Stream_Element_Offset;
begin
accept Start;
Address.Addr := Sockets.Inet_Addr ("127.0.0.1");
Address.Port := Port;
loop
Sockets.Create_Socket (Socket);
Sockets.Connect_Socket (Socket, Address);
Sockets.Send_Socket (Socket, (1 .. 32 => 22), Last);
accept Sent;
Sockets.Shutdown_Socket (Peer);
Sockets.Close_Socket (Peer);
-- Just close, do not shutdown, because opposite
-- peer is already closed.
Sockets.Close_Socket (Socket);
end loop;
exception
when E : others =>
Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Information (E));
end Client;
begin
Sockets.Initialize;
Sockets.Create_Socket (Server);
Sockets.Bind_Socket
(Server,
(Sockets.Family_Inet,
Sockets.Any_Inet_Addr,
Port));
Sockets.Listen_Socket (Server);
Client.Start;
loop
Sockets.Accept_Socket (Server, Peer, Address);
declare
use Ada.Streams;
Data : Stream_Element_Array (1 .. 256);
Last : Stream_Element_Offset;
begin
Client.Sent;
loop
Sockets.Receive_Socket (Peer, Data, Last);
if Last < Data'First then
Ada.Text_IO.Put_Line ("closed on opposite.");
end if;
end loop;
exception
when Sockets.Socket_Error =>
Count := Count + 1;
Ada.Text_IO.Put (Indicator (Count mod 4) & ASCII.CR);
if Count rem 100 = 0 then
Ada.Text_IO.Put (Count'Img & ASCII.CR);
end if;
end;
end loop;
exception
when E : others =>
Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Information (E));
end SBreak;