Есть ли способ использовать клиентский сокет не блокирующим способом.OCaml неблокирующий клиентский сокет
Например, если я создаю сокет для подключения клиента на сервере и что я рекурсивный recv
на этом сокете, последний вызов Unix.recv
будет блокироваться, когда данные не будут отправлены, и если соединение не будет закрыто сервер.
В C, вы можете указать флаги для обоих:
socket()
и использоватьSOCK_NONBLOCK
флаг Ored с типом сокета- или
receiv()
сMSG_DONTWAIT
флагами.
Я смотрел здесь:
- http://caml.inria.fr/pub/docs/manual-ocaml/libref/Unix.html#TYPEsocket_bool_option
- http://caml.inria.fr/pub/docs/manual-ocaml/libref/Unix.html#TYPEsocket_type
- http://caml.inria.fr/pub/docs/manual-ocaml/libref/Unix.html#TYPEmsg_flag
- https://ocaml.github.io/ocamlunix/ocamlunix.html#sec119
Но я не мог найти информацию по этому вопросу.
Рекурсивный 'recv()' 'ничего не значит. – EJP
Да, вы правы, извините, я хотел сказать, когда вы вызываете 'recv' в рекурсивной функции, пока все данные не будут прочитаны. Может быть, я должен был бы сказать несколько вызовов на 'recv', пока все данные не будут прочитаны. – cedlemo
Вы посмотрели на Lwt (http://ocsigen.org/lwt/2.5.2/manual/)? Он предоставляет множество инструментов для неблокирующих операций. Например, 'Lwt_unix.recv' (http://ocsigen.org/lwt/2.5.2/api/Lwt_unix#VALrecv) является неблокирующим эквивалентом' Unix.recv'. – hcarty