읽을 것이 없을 때까지 소켓에서 데이터를 읽는 간단한 클라이언트에 대해 Lwt_unix
모듈을 사용하려고했습니다.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
비 블로킹 소켓을 만들 수 있지만, 내 코드와 함께, 여전히 차단하고 있다는 얘기
./lwt_socket_client
_read
8
_read
어떤 블록 내가 Ctrl 키 + C을 명중 할 때까지.
내가 함께 모두 시도 :
Lwt_unix.set_blocking sock false;
및
Lwt_unix.set_blocking sock true;
이 라인이없는 과정의
,하지만 여전히 차단하고 있습니다. 내가 도대체 뭘 잘못하고있는 겁니까? 내 앞의 질문의 더 많은 정보에 대한, 하나 OCaml non-blocking client socket
주 :'ignore_result x; ... "는"그것을 기다리지 않고 백그라운드에서 수행 "을 의미합니다. 당신은 다음과 같이하자. x >> = fun() -> ...'(x가 끝날 때까지 기다린다.) –