3

Lwt_unix読み取るものがなくなるまでソケット内のデータを読み取る単純なクライアント用のモジュールを試してみたかったのです。ブロックしていないソケットを作成すると言う人もい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+を押すまでブロックしcます。

私は両方を試しました:

Lwt_unix.set_blocking sock false;

Lwt_unix.set_blocking sock true;

もちろん、この行はありませんが、まだブロックされています。私は何を間違っていますか?

詳細については、私の以前の質問の 1 つ: OCaml ノンブロッキング クライアント ソケット

4

2 に答える 2