我想嘗試Lwt_unix
模塊,用於讀取套接字中數據的簡單客戶機,直到沒有任何可讀的內容。一些人告訴我Lwt
創建非阻塞套接字,但我的代碼,它仍然是阻止:OCaml:Lwt和非阻塞套接字
open Lwt
open Unix
(* ocamlfind ocamlc -o lwt_socket_client -package lwt,lwt.unix,unix -linkpkg -g lwt_socket_client.ml *)
let host = Unix.inet_addr_loopback
let port = 6600
let create_socket() =
let sock = Lwt_unix.socket PF_INET SOCK_STREAM 0 in
Lwt_unix.set_blocking sock false;
sock
let s_read sock maxlen =
let str = Bytes.create maxlen in
let rec _read sock acc =
Lwt.ignore_result(Lwt_io.write_line Lwt_io.stdout "_read");
Lwt_unix.read sock str 0 maxlen >>= fun recvlen ->
Lwt.ignore_result(Lwt_io.write_line Lwt_io.stdout (string_of_int recvlen));
if recvlen = 0 then Lwt.return (acc)
else _read sock (acc^(String.sub str 0 recvlen))
in _read sock ""
let socket_read sock =
Lwt.ignore_result(Lwt_unix.connect sock @@ ADDR_INET(host, port));
s_read sock 1024 >>= fun answer ->
Lwt_io.write_line Lwt_io.stdout answer
let() =
let sock = create_socket() in
Lwt_main.run (socket_read sock)
如果我在一個任期嘗試這個例子有:
echo "totoche" | netcat -l 127.0.0.1 -p 6600
那麼結果是:
./lwt_socket_client
_read
8
_read
哪個塊,直到我打按Ctrl +ç。
我有試過兩個:
Lwt_unix.set_blocking sock false;
和
Lwt_unix.set_blocking sock true;
當然沒有這條線的和,但它仍然阻擋。我究竟做錯了什麼?
欲瞭解更多信息,一個我以前的問題: OCaml non-blocking client socket
注意:'ignore_result x; ......'意味着「在後臺不做等待」。你可能想要'x >> = fun() - > ...'(等待x完成,然後...) –