Import Debian changes 20180207-1
[hcoop/debian/mlton.git] / regression / socket.sml
CommitLineData
7f918cf1
CE
1val addr = INetSock.any 0
2val socket = INetSock.TCP.socket ()
3val _ = Socket.bind (socket, addr)
4val _ = Socket.listen (socket, 5)
5val addr = Socket.Ctl.getSockName socket
6
7fun read socket : string =
8 Byte.unpackStringVec (Word8VectorSlice.full (Socket.recvVec (socket, 100)))
9
10fun readNB socket : string option =
11 Option.map (Byte.unpackStringVec o Word8VectorSlice.full)
12 (Socket.recvVecNB (socket, 100))
13
14fun write (socket, s: string): unit =
15 (Socket.sendVec (socket, Word8VectorSlice.full (Byte.stringToBytes s))
16 ; ())
17
18val _ =
19 print (case Socket.acceptNB socket of
20 NONE => "OK\n"
21 | SOME _ => "WRONG\n")
22
23val _ =
24 case Posix.Process.fork () of
25 NONE =>
26 let
27 val _ = Posix.Process.sleep (Time.fromSeconds 1)
28 val (socket, _) = Socket.accept socket
29 val _ = print (read socket)
30 val _ = print (case readNB socket of
31 NONE => "NONE\n"
32 | SOME s => s)
33 val _ = write (socket, "goodbye, world\n");
34 val _ = Socket.close socket
35 in
36 ()
37 end
38 | SOME pid =>
39 let
40 val socket' = INetSock.TCP.socket ()
41 val _ = Socket.connect (socket', addr)
42 val _ = write (socket', "hello, world\n")
43 val _ = print (read socket')
44 val _ = Socket.close socket'
45 val (pid', status) = Posix.Process.wait ()
46 in
47 if pid = pid' andalso status = Posix.Process.W_EXITED
48 then ()
49 else print "child failed\n"
50 end