|
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