(* File mosml/src/dynlibs/msocket/testsocket.sml This is a collect of socket examples, not a systematic test suite. *) val _ = app load ["FileSys", "Socket", "Byte"]; (* fun fileclient name s = let val sock = Socket.fileStream () val addr = Socket.fileAddr name val vec = Byte.stringToBytes s val _ = Socket.connect(sock, addr) in Socket.sendVec (sock, vec); Socket.recvVec (sock, size s) end fun fileserver name = let val sock = Socket.fileStream () val addr = Socket.fileAddr name val _ = Socket.bind(sock, addr) val _ = Socket.listen(sock, 150); val (n,a) = Socket.accept sock val vec = Socket.recvVec(n,20) val ls = Word8Vector.foldl op:: nil vec val s = String.implode (map Byte.byteToChar ls) in Socket.sendVec(n,Byte.stringToBytes s); vec end *) fun buff v = { buf=v, ofs=0, size=NONE} fun fileclient ipno s = let val sock = Socket.fileStream () before print "gif1\n" val addr = Socket.fileAddr ipno before print "gif2\n" val vec = Byte.stringToBytes s val _ = Socket.connect(sock, addr) before print "gif3\n" in Socket.sendVec (sock, buff vec); print "gif4\n"; print(Byte.bytesToString(Socket.recvVec (sock, size s))); print "gif5\n"; Socket.close sock; print "gif6\n" end fun fileserver ipno = let val sock = Socket.fileStream () val addr = Socket.fileAddr ipno val _ = Socket.bind(sock, addr) val c = ref 5; in Socket.listen(sock, 150); while !c > 0 do let val (n,a) = Socket.accept sock val vec = Socket.recvVec(n,20) val ls = Word8Vector.foldl op:: nil vec val s = String.implode (map Byte.byteToChar ls) in print (Byte.bytesToString vec^"\n"); Socket.sendVec(n, buff(Byte.stringToBytes s)); Socket.close n; c := !c - 1 end; Socket.close sock end fun inetclient ipno port s = let val sock = Socket.inetStream () val addr = Socket.inetAddr ipno port val vec = Byte.stringToBytes s in Socket.connect(sock, addr); Socket.sendVec (sock, buff vec); Byte.bytesToString (Socket.recvVec (sock, size s)) before Socket.close sock end fun inetserver ipno port = let val sock = Socket.inetStream () val addr = Socket.inetAddr ipno port val _ = Socket.bind(sock, addr) val _ = Socket.listen(sock, 150); val c = ref 7; in ((while !c > 0 do let val (n,a) = Socket.accept sock val vec = Socket.recvVec(n,20) (* Reverse the bytes in the vector *) val ls = Word8Vector.foldl op:: nil vec val s = String.implode (map Byte.byteToChar ls) in Socket.sendVec(n, buff(Byte.stringToBytes s)); print ("Server: sent response " ^ s ^ " to client\n"); Socket.close n; c := !c - 1 end) handle Interrupt => ()); Socket.close sock end fun revmsg from = let val (sock,a) = Socket.accept from val vec = Socket.recvVec(sock,20) val ls = Word8Vector.foldl op:: nil vec val s = String.implode (map Byte.byteToChar ls) in print ("Server: "^Byte.bytesToString vec^"\n"); Socket.sendVec(sock, buff(Byte.stringToBytes s)); Socket.close sock end fun selinet ipno port1 port2 = let val sock1 = Socket.inetStream () val sock2 = Socket.inetStream () val addr1 = Socket.inetAddr ipno port1 val addr2 = Socket.inetAddr ipno port2 val _ = Socket.bind(sock1, addr1) val _ = Socket.bind(sock2, addr2) val _ = Socket.listen(sock1, 150); val _ = Socket.listen(sock2, 150); val socks = [sock1, sock2] val rls = map Socket.sockDesc socks fun getrdys [] _ = [] | getrdys (sck1::sckr) (rdys as (rdy1::rdyr)) = if Socket.sameDesc(Socket.sockDesc sck1, rdy1) then sck1 :: getrdys sckr rdyr else getrdys sckr rdys in ((while true do let val {rds, ...} = Socket.select { rds=rls, wrs=nil, exs=nil, timeout=NONE } in app revmsg (getrdys socks rds) end) handle _ => ()); Socket.close sock1; Socket.close sock2 end; val _ = print "\nSimple client/server example with sockets\n\ \-----------------------------------------\n\ \Assume that the IP address of your machine is 130.225.40.253.\n\ \and let us choose port number 3000 for this experiment.\n\ \(1) Run this in an Moscow ML session on your machine:\n\ \ inetserver \"130.225.40.253\" 3000;\n\ \(2) Run this in another mosml session, possibly on another machine:\n\ \ val f = inetclient \"130.225.40.253\" 3000;\n\ \ f \"abcde\";\n\ \ f \"reversed\";\n\ \ f \"12345\";\n\n"