open Unix;;

let open_server port =
  let socket = socket PF_INET SOCK_STREAM 0 in
  setsockopt socket SO_REUSEADDR true;
  bind socket (ADDR_INET (inet_addr_anyport));
  listen socket 20;
  socket;;

let string_of_sockaddr s =
  match s with
  | ADDR_UNIX s -> s
  | ADDR_INET (inet,p) -> (string_of_inet_addr inet)^":"^(string_of_int p);;

let establish_thread_server f port =
  let socket_server = open_server port in
  while true do
    let socket_connection,client_addr = accept socket_server in
    Printf.eprintf "Connection from %s.\n" (string_of_sockaddr client_addr);
    Pervasives.flush Pervasives.stderr;
    ignore (Thread.create f socket_connection)
  done;;