2016-09-21 4 views
0

Есть ли способ использовать клиентский сокет не блокирующим способом.OCaml неблокирующий клиентский сокет

Например, если я создаю сокет для подключения клиента на сервере и что я рекурсивный recv на этом сокете, последний вызов Unix.recv будет блокироваться, когда данные не будут отправлены, и если соединение не будет закрыто сервер.

В C, вы можете указать флаги для обоих:

  • socket() и использовать SOCK_NONBLOCK флаг Ored с типом сокета
  • или receiv() с MSG_DONTWAIT флагами.

Я смотрел здесь:

Но я не мог найти информацию по этому вопросу.

+0

Рекурсивный 'recv()' 'ничего не значит. – EJP

+0

Да, вы правы, извините, я хотел сказать, когда вы вызываете 'recv' в рекурсивной функции, пока все данные не будут прочитаны. Может быть, я должен был бы сказать несколько вызовов на 'recv', пока все данные не будут прочитаны. – cedlemo

+1

Вы посмотрели на 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

ответ

1

Использовать Unix.set_nonblock и Unix.clear_nonblock.

+0

Я думаю, мне придется иметь дело с ошибкой Unix EINPROGRESS и EAGAIN. Может быть, любая ссылка на пример кода? – cedlemo

+1

http://pleac.sourceforge.net/pleac_ocaml/sockets.html –

Смежные вопросы