Client Server code in OCaml style
Using semicolons is OK. The IO is imperative and side-effectfull by default, so there is nothing to do here. By saying Lwt_unix.listen sock max_pending_request you're just setting a property inside the kernel. It is not blocking, so there is no need to create a thread here. 

However, you should never use ignore function, to cast away the Lwt.t type. This is an error. The returned value is a thread, and the effect of connection will not happen, until the thread is determined. So, when you call sock_recv on the sock it might fail with ENOTCONN error. In case, when you really don't need the result of the computation, from a thread, and you don't need to sync with it, you can use Lwt.ignore_result or Lwt.async function, to create a background thread, that will be handled by the system. Note, however, that any exception thrown from the ignored computation will terminate the program, that basically means, that the the computation should never throw exceptions. 

And few stylistic notes:


Your indentation is incorrect. Use ocp-indent for indentation, it handles monadic operands (that shouldn't be nested). 
You can deconstruct values basically in any context, where you can bind, e.g., 

let accept_connection conn =
  let fd, _ = conn in


can be written as

let accept_connection (fd,_) =

Instead of using expr &gt;&gt;= return value pattern, you can use the map operator &gt;|=. For example, the following

  Lwt_unix.recv sock str 0 maxlen [] &gt;&gt;= fun recvlen -&gt;
  return (String.sub str 0 recvlen)


Can be rewritten as,

  Lwt_unix.recv sock str 0 maxlen [] &gt;|= String.sub str 0