|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 9216 (0x2400)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Echo, seg_002fe3
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦5a81ac88f⟧ »Space Info Vol 1«
└─⟦this⟧
with Byte_Defs;
with Calendar;
with Log;
with Profile;
with Time_Utilities;
with Transport;
with Transport_Name;
with Utilities;
--
package body Echo is
use Utilities;
procedure Server (Network : Transport_Defs.Network_Name := "UDP/IP";
Socket : Transport_Defs.Socket_Id := Echo.Socket) is
C : Transport.Connection_Id;
Status : Transport_Defs.Status_Code;
Count : Natural;
Data : Byte_Defs.Byte_String (1 .. 1024);
begin
Log.Put_Line ("echo.server");
loop -- forever
begin
Transport.Open (C, Status, Network, Socket);
Check (Status, "Transport.Open");
Transport.Connect (C, Status);
Check (Status, "Transport.Connect");
loop
Transport.Receive (C, Status, Data, Count);
Check (Status, "Transport.Receive");
Transport.Transmit (C, Status, Data (1 .. Count), Count);
Check (Status, "Transport.Transmit");
end loop;
exception
when others =>
null;
end;
Transport.Close (C);
exit when Transport_Defs."=" (Status, Transport_Defs.Socket_In_Use);
end loop;
end Server;
procedure Client (Server : Transport_Defs.Host_Id;
Data : Byte_Defs.Byte_String;
Repeat : Positive := 1;
Interval : Duration := 0.0;
Max_Wait : Duration := Echo.Max_Wait;
Network : Transport_Defs.Network_Name := "UDP/IP";
Socket : Transport_Defs.Socket_Id := Echo.Socket) is
C : Transport.Connection_Id;
Status : Transport_Defs.Status_Code;
Sent : constant Byte_Defs.Byte_String (1 .. Data'Length) := Data;
Count, Total : Natural;
Started : Calendar.Time;
task Receiver is
entry Start;
entry Finish;
end Receiver;
task body Receiver is
Count : Natural;
Total : Natural := 0;
Rcvd : Byte_Defs.Byte_String (Sent'Range);
Elapsed : Duration;
Packets : Natural := 0;
Min : Duration := Duration'Last;
Max : Duration := 0.0;
Ttl : Duration := 0.0;
begin
loop
select
accept Start;
or
accept Finish;
exit;
end select;
begin
Transport.Receive (C, Status, Rcvd, Total, Max_Wait);
while Total < Rcvd'Length loop
Check (Status, "Transport.Receive");
Transport.Receive
(C, Status, Rcvd (1 + Total .. Rcvd'Last),
Count, Max_Wait);
Total := Total + Count;
end loop;
Elapsed := Calendar."-" (Calendar.Clock, Started);
if Byte_Defs."=" (Rcvd, Sent) then
Packets := Packets + 1;
Ttl := Ttl + Elapsed;
if Min > Elapsed then
Min := Elapsed;
end if;
if Max < Elapsed then
Max := Elapsed;
end if;
else
Log.Put_Line ("Data were not echoed correctly.",
Profile.Error_Msg);
end if;
exception
when others =>
null;
end;
end loop;
if Packets = 1 then
Log.Put_Line ("echoed" & Natural'Image (Sent'Length) &
" bytes in " & Time_Utilities.Image (Ttl),
Profile.Auxiliary_Msg);
elsif Packets > 1 then
Log.Put_Line ("echoed" & Natural'Image (Packets) &
Natural'Image (Sent'Length) & "-byte packets in:",
Profile.Auxiliary_Msg);
Log.Put_Line ("average " & Time_Utilities.Image (Ttl / Packets),
Profile.Auxiliary_Msg);
Log.Put_Line ("minimum " & Time_Utilities.Image (Min),
Profile.Auxiliary_Msg);
Log.Put_Line ("maximum " & Time_Utilities.Image (Max),
Profile.Auxiliary_Msg);
end if;
Transport.Close (C);
end Receiver;
procedure Transmit is
begin
Receiver.Start;
Started := Calendar.Clock;
Transport.Transmit (C, Status, Sent, Total);
while Total < Sent'Length loop
Check (Status, "Transport.Transmit");
Transport.Transmit (C, Status,
Sent (1 + Total .. Sent'Last), Count);
Total := Total + Count;
end loop;
end Transmit;
begin
Log.Put_Line ("echo.client");
Transport.Open (C, Status, Network);
Check (Status, "Transport.Open");
Transport.Connect (C, Status, Server, Socket);
Check (Status, "Transport.Connect");
Transmit;
for I in 2 .. Repeat loop
delay Interval;
Transmit;
end loop;
Receiver.Finish;
exception
when others =>
abort Receiver;
Transport.Close (C);
raise;
end Client;
procedure Client (Server : String := ">>machine name<<";
Data : Byte_Defs.Byte_String;
Repeat : Positive := 1;
Interval : Duration := 0.0;
Max_Wait : Duration := Echo.Max_Wait;
Network : Transport_Defs.Network_Name := "UDP/IP";
Socket : Transport_Defs.Socket_Id := Echo.Socket) is
begin
Client (Transport_Name.Host_To_Host_Id (Server), Data,
Repeat, Interval, Max_Wait, Network, Socket);
exception
when Transport_Name.Undefined =>
Log.Put_Line
('"' & Server &
""" is not a machine name (Transport_Name.Undefined).",
Profile.Exception_Msg);
raise;
end Client;
procedure Client (Server : Transport_Defs.Host_Id;
Data : String := "hello!";
Repeat : Positive := 1;
Interval : Duration := 0.0;
Max_Wait : Duration := Echo.Max_Wait;
Network : Transport_Defs.Network_Name := "UDP/IP";
Socket : Transport_Defs.Socket_Id := Echo.Socket) is
begin
Client (Server, Convert (Data), Repeat,
Interval, Max_Wait, Network, Socket);
end Client;
procedure Client (Server : String := ">>machine name<<";
Data : String := "hello!";
Repeat : Positive := 1;
Interval : Duration := 0.0;
Max_Wait : Duration := Echo.Max_Wait;
Network : Transport_Defs.Network_Name := "UDP/IP";
Socket : Transport_Defs.Socket_Id := Echo.Socket) is
begin
Client (Server, Convert (Data), Repeat,
Interval, Max_Wait, Network, Socket);
end Client;
end Echo;
nblk1=8
nid=0
hdr6=10
[0x00] rec0=20 rec1=00 rec2=01 rec3=03c
[0x01] rec0=16 rec1=00 rec2=02 rec3=03a
[0x02] rec0=1c rec1=00 rec2=03 rec3=064
[0x03] rec0=18 rec1=00 rec2=04 rec3=016
[0x04] rec0=13 rec1=00 rec2=05 rec3=02e
[0x05] rec0=1d rec1=00 rec2=06 rec3=010
[0x06] rec0=16 rec1=00 rec2=07 rec3=03e
[0x07] rec0=15 rec1=00 rec2=08 rec3=000
tail 0x20f0013e4000806bb9332 0x42a00088462060003