I am currently trying to build a TCP socket server, which has a conversation with a client via the unrepl protocol. So far I got the initial handshake working, so the server is saying “hello” on each client connect.
After the hello message, I wait for the client to pass me an ocaml program as a stream of characters… after the termination character (i think with netcat ^D is using \x00 to terminate?) the server should parse the data and eval the program.
So far so good, I got it to work with
Lwt_io.readlines in_chan on the first call… now I want to make this recursive. After evaling, the server should again wait for a stream of data until the next termination character.
So far I got this this code (doesn’t work as expected yet):
let rec loop in_chan out_chan = try (* Wait until EOF and read all lines separated with \n etc. *) let in_stream = Lwt_io.read_lines in_chan in let%lwt program = Lwt_stream.fold (fun line acc -> acc ^ (Format.sprintf "\n%s" line)) in_stream "" in let%lwt result = Eval.eval_lwt program in let%lwt () = match result with | Error msg -> send_exn out_chan msg | _ -> Lwt.join [ send_eval out_chan Unrepl.NoPayload; send_prompt out_chan; print_result result; ] in loop in_chan out_chan with _ -> Lwt.return_unit
This code will first do the right thing on the first try (evaling the passed program), but after that it will loop indefinitely, getting a
progam = "".
I guess this has something to do with the mechanics of
Lwt_io.readlines… does anyone know how to design this in a blocking manner?