Another network client, that asks a number of network time servers, listed on the command line, for current time. Here is a sample run:
examples> ./PingTimeServers time.nist.gov time-a.nist.gov time.ien.it dummy localhost dummy: Name lookup error localhost: Connection failed time-a.nist.gov: 54786 08-11-16 16:51:48 00 0 0 254.7 UTC(NIST) * time.ien.it: Sun Nov 16 17:51:47 2008 time.nist.gov: no response examples>
The program connects to servers that use the old Daytime Protocol, listening on TCP port 13. In this protocol, a time server will immediately when connection has been established send current time and close the connection. The three first arguments above are existing time servers. Two of these responded quickly with time in this run, while time.nist.gov did not respond within two seconds. The fourth argument is a nonsense host that the name server will not identify and the final argument, localhost, is a valid host which will probably not run a time server.
Here is the program:
module PingTimeServers where
import POSIX
import Data.Functional.List
port = Port 13 -- standard port for time servers
client neterror report sock = class
established = action
sock.inFile.installR report
close = request result ()
result Connection {..}
root env = class
args = [1..size env.argv-1]
print i mess = env.stdout.write
(env.argv!i ++ ": "++ mess ++ "\n")
outstanding := args
report i mess = action
outstanding := delete i outstanding
print i mess
if (null outstanding) then env.exit 0
result action
forall i <- args do
env.inet.tcp.connect (Host (env.argv!i))
port
(client (report i) (report i))
after (sec 2) action
forall i <- outstanding do
print i "no response"
env.exit 0
Comments to the code: