【发布时间】:2017-01-29 13:08:28
【问题描述】:
有没有办法以非阻塞方式使用客户端套接字。
例如,如果我为客户端创建一个套接字以在服务器上进行连接,并且我在该套接字上执行递归 recv,则当没有发送数据并且连接正常时,Unix.recv 的最后一次调用将阻塞没有被服务器关闭。
在 C 中,您可以为两者指定标志:
-
socket()并将SOCK_NONBLOCK标志与套接字类型进行 ORed - 或带有
MSG_DONTWAIT标志的receiv()。
我看过这里:
- 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
但我找不到任何有关此的信息。
【问题讨论】:
-
'Recursive
recv()' 没有任何意义。 -
是的,你是对的,对不起,我想说当你在递归函数中调用
recv直到读取所有数据。也许我应该多次调用recv,直到读取所有数据。 -
你看过 Lwt (ocsigen.org/lwt/2.5.2/manual) 吗?它为非阻塞操作提供了许多工具。例如,
Lwt_unix.recv(ocsigen.org/lwt/2.5.2/api/Lwt_unix#VALrecv) 是与Unix.recv等效的非阻塞式。 -
@hcarty,不,我没有为这个特殊的问题查看 Lwt,但是我会的。