【问题标题】:OCaml non-blocking client socketOCaml 非阻塞客户端套接字
【发布时间】:2017-01-29 13:08:28
【问题描述】:

有没有办法以非阻塞方式使用客户端套接字。

例如,如果我为客户端创建一个套接字以在服务器上进行连接,并且我在该套接字上执行递归 recv,则当没有发送数据并且连接正常时,Unix.recv 的最后一次调用将阻塞没有被服务器关闭。

在 C 中,您可以为两者指定标志:

  • socket() 并将 SOCK_NONBLOCK 标志与套接字类型进行 ORed
  • 或带有MSG_DONTWAIT标志的receiv()

我看过这里:

但我找不到任何有关此的信息。

【问题讨论】:

  • '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,但是我会的。

标签: sockets ocaml


【解决方案1】:

【讨论】:

  • 我想,我将不得不处理 Unix 错误 EINPROGRESS 和 EAGAIN。任何指向代码示例的链接都可以吗?
猜你喜欢
  • 2017-04-18
  • 1970-01-01
  • 2020-10-30
  • 2016-03-18
  • 1970-01-01
  • 2021-02-15
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多