假设有一个线程,一个简单的服务器接受一个连接,另一个线程与客户端。
let () =
let sock = create_socket () in
let threads = Lwt.join [create_server sock; sock_read sock] in
Lwt_main.run threads
我试着写这样的客户端:
let sock_recv sock maxlen =
let str = Bytes.create maxlen in
let recvlen = Lwt_unix.recv sock str 0 maxlen [] in
String.sub str 0 recvlen
let sock_read sock =
let answer = sock_recv sock 512 in
Lwt_io.write_line Lwt_io.stdout answer
我有一个错误说:
File "lwt_server.ml", line 38, characters 19-26:
Error: This expression has type int Lwt.t
but an expression was expected of type int
与此有关:String.sub str 0 recvlen
回答这个问题(Working with ocaml Lwt sockets)我理解为了得到int
值,我必须用bind
函数或中缀运算符>>=
创建一个线程,后跟一个匿名函数。但我所有的尝试都失败了。
那么如何在Lwt线程中读取套接字呢?
你的sock_recv
和sock_read
函数应该这样写:
let sock_recv sock maxlen =
let str = Bytes.create maxlen in
Lwt_unix.recv sock str 0 maxlen [] >>= fun recvlen ->
Lwt.return (String.sub str 0 recvlen)
let sock_read sock =
sock_recv sock 512 >>= fun answer ->
Lwt_io.write_line Lwt_io.stdout answer
即,当let x = foo in
返回Lwt值时,用foo >>= fun x ->
替换foo
的出现次数。但是>>=
的右侧也必须返回一个Lwt值(因此在Lwt.return
中调用sock_recv
)。