sockets - Using TCP in Standard ML -
i'm trying write minimal tcp server in standard ml , getting type errors don't understand. i've got far is
fun sendhello sock = let val res = "http/1.1 200 ok\r\ncontent-length: 12\r\n\r\nhello world!\r\n\r\n" val wds = map (fn c => word8.fromint (char.ord c)) (string.explode res) val slc = arrayslice.full (array.fromlist wds) in socket.sendarr (sock, slc) socket.close sock end fun acceptloop serv = let val (s, _) = socket.accept serv in print "accepted connection...\n"; sendhello s; acceptloop serv end fun serve () = let val s = inetsock.tcp.socket() in socket.ctl.setreuseaddr (s, true); socket.bind(s, inetsock.any 8989); socket.listen(s, 5); print "entering accept loop...\n"; acceptloop s end the latter 2 functions work fine (if comment out sendhello line, typecheck without complaint, , set server prints accepted connection... every time client connects).
from understand socket struct, sendarr should take tuple of socket , word8arrayslice.slice, i'm reasonably sure i'm providing.
smlnj - arrayslice.full (array.fromlist (map (fn c => word8.fromint (char.ord c)) (string.explode "http/1.1 200 ok\r\ncontent-length: 12\r\n\r\nhello world!\r\n\r\n"))) ;; val = sl {base=[|0wx48,0wx54,0wx54,0wx50,0wx2f,0wx31,0wx2e,0wx31,0wx20,0wx32,0wx30, 0wx30,...|],start=0,stop=49} : word8.word arrayslice.slice - the error is
- fun sendhello sock = let val res = "http/1.1 200 ok\r\ncontent-length: 12\r\n\r\nhello world!\r\n\r\n" val wds = map (fn c => word8.fromint (char.ord c)) (string.explode res) val slc = arrayslice.full (array.fromlist wds) in socket.sendarr (sock, slc) socket.close sock end ;; = = = = = = = stdin:35.8-36.25 error: operator , operand don't agree [tycon mismatch] operator domain: ('z,socket.active socket.stream) socket.sock * ?.word8arrayslice.slice operand: ('z,socket.active socket.stream) socket.sock * word8.word arrayslice.slice in expression: socket.sendarr (sock,slc) - can educate me regarding need working?
it turns out arrayslice of word8s not same thing word8arrayslice. in order latter string, need call packstring appropriate array. decided use vectors instead, meant word8vectorslice.full (byte.stringtobytes res) thing send out via socket.sendvec. below works fine:
fun sendhello sock = let val res = "http/1.1 200 ok\r\ncontent-length: 12\r\n\r\nhello world!\r\n\r\n" val slc = word8vectorslice.full (byte.stringtobytes res) in socket.sendvec (sock, slc); socket.close sock end
Comments
Post a Comment