2016-09-14 7 views
0

クライアントがソケットに接続してクライアントにデータを送信して終了する小さなサーバーをOUnitテストで書きたいと思っていました。OCaml:Lwt式が型単位Lwt.tで期待されました

これを私のテストで使用したかったので、私はスレッドでサーバーを作成し、スレッドでクライアントを作成する必要があると考えました。ここで

open Sys 
open Unix 
open Lwt 

(* a simple server that send a message when a client connects 
* compile with 
* ocamlfind ocamlc -o lwt_server -package lwt,lwt.unix,unix -linkpkg -g lwt_server.ml 
* http://baturin.org/code/lwt-counter-server/ 
* https://mirage.io/wiki/tutorial-lwt 
* http://aubedesheros.blogspot.fr/2011/05/ocaml-lwt-mini-tutorial.html 
*) 

let host = Unix.inet_addr_loopback (* 127.0.0.1 *) 
let port = 6600 
let max_pending_request = 10 

(* Initialize logging capabilities at INFO level *) 

let() = Lwt_log.add_rule "*" Lwt_log.Info 

let send_message oc = 
    Lwt_io.write_line oc "test" 

let accept_connection conn = 
    let fd, _ = conn in 
    let oc = Lwt_io.of_fd Lwt_io.Output fd in 
    Lwt.on_failure (send_message oc) (fun e -> Lwt_log.ign_error (Printexc.to_string e)); 
    Lwt_log.info "New connection" >>= return 

let create_server sock = 
    let serve() = 
    Lwt_unix.accept sock >>= accept_connection 
    in serve 

let sock_recv sock maxlen = 
    let str = Bytes.create maxlen in 
    let recvlen = 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 

let create_socket() = 
    let sock = Lwt_unix.socket PF_INET SOCK_STREAM 0 in 
    Lwt_unix.bind sock @@ ADDR_INET(host, port); 
    Lwt_unix.listen sock max_pending_request; 
    sock 


let() = 
    let sock = create_socket() in 
    let threads = Lwt.join [create_server sock; sock_read sock] in 
     Lwt_main.run threads 

私はそれをコンパイルするオーデルに使用するコマンドライン53が参照する

ocamlfind ocamlc -o lwt_server -package lwt,lwt.unix,unix -linkpkg -g lwt_server.ml 
File "lwt_server.ml", line 53, characters 28-46: 
Error: This expression has type unit -> unit Lwt.t 
     but an expression was expected of type unit Lwt.t 

(冗談は、私が二回チェックした)エラーメッセージされていますので、ここでのコードは次のとおりです。

 let threads = Lwt.join [create_server sock; sock_read sock] in 

Lwtを初めて使用するのは、OUnitで使用する必要があるかどうかわかりません。

答えて

1

問題は型エラーに示されているようにcreate_server sock戻り型unit -> unit Lwt.tの別の機能よりもむしろ1重量スレッド(unit Lwt.t)ことである。

let create_server sock = 
    let serve() = 
    Lwt_unix.accept sock >>= accept_connection 
    in serve (* serve is a function, not a thread *) 

あなたがスレッドではなく、関数を返すために、これを書き換えることができこのタイプのエラーを修正してください:

私はコード全体をテストしていませんが、タイプエラーが修正されるはずです。

関連する問題