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

Popular posts from this blog

python - TypeError: start must be a integer -

c# - DevExpress RepositoryItemComboBox BackColor property ignored -

django - Creating multiple model instances in DRF3 -