Commit | Line | Data |
---|---|---|
7f918cf1 CE |
1 | val addr = INetSock.any 0 |
2 | val socket = INetSock.TCP.socket () | |
3 | val _ = Socket.bind (socket, addr) | |
4 | val _ = Socket.listen (socket, 5) | |
5 | val addr = Socket.Ctl.getSockName socket | |
6 | ||
7 | fun read socket : string = | |
8 | Byte.unpackStringVec (Word8VectorSlice.full (Socket.recvVec (socket, 100))) | |
9 | ||
10 | fun readNB socket : string option = | |
11 | Option.map (Byte.unpackStringVec o Word8VectorSlice.full) | |
12 | (Socket.recvVecNB (socket, 100)) | |
13 | ||
14 | fun write (socket, s: string): unit = | |
15 | (Socket.sendVec (socket, Word8VectorSlice.full (Byte.stringToBytes s)) | |
16 | ; ()) | |
17 | ||
18 | val _ = | |
19 | print (case Socket.acceptNB socket of | |
20 | NONE => "OK\n" | |
21 | | SOME _ => "WRONG\n") | |
22 | ||
23 | val _ = | |
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 |