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 word8
s not same thing word8arrayslice
. in order latter string, need call packstring
appropriate array. decided use vector
s 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