OCaml:如何在Lwt线程内的套接字中读取

问题描述 投票:0回答:1

假设有一个线程,一个简单的服务器接受一个连接,另一个线程与客户端。

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线程中读取套接字呢?

ocaml
1个回答
1
投票

你的sock_recvsock_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)。

© www.soinside.com 2019 - 2024. All rights reserved.