首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ocaml Lwt套接字

使用ocaml Lwt套接字
EN

Stack Overflow用户
提问于 2015-08-19 18:25:55
回答 1查看 1.3K关注 0票数 0

我已经学习Ocaml一个星期了,有些事情变得清晰了,其他的事情却没有。我试图组成一个简单的Tic Toe服务器,通过telnet接受连接。只想说几句。我必须使用Lwt和严谨,现在对我来说,这似乎是一个黑暗的地方,因为我已经面对太多的语言特征。守则的开始:

代码语言:javascript
复制
let sock = Lwt_unix.socket Unix.PF_INET Unix.SOCK_STREAM 0

let setting_up_server_socket =  
    let sockaddr = (Unix.ADDR_INET(Unix.inet_addr_of_string "127.0.0.1", 23233)) in
    Lwt_unix.set_close_on_exec sock;
    Lwt_unix.setsockopt sock Unix.SO_REUSEADDR true;
    Lwt_unix.bind sock sockaddr;
    Lwt_unix.listen sock 20

好的,没问题。服务器套接字设置为侦听客户端连接。让我们试着找第一位客人:

代码语言:javascript
复制
let handle_income = 
    Lwt_unix.accept sock;;

似乎很清楚,但:

代码语言:javascript
复制
val handle_income : (Lwt_unix.file_descr * Lwt_unix.sockaddr) Lwt.t = <abstr>

我被堆起来了。我甚至不知道如何向客户端套接字发送消息。与一般的Unix.accept不同,它返回('a * 'b) Lwt.t。一些问题:

  1. 我怎样才能得到纯客户端的"Lwt_unix.file_descr“呢?
  2. ('a * 'b) Lwt.t是一个属于Lwt.t对象的元组,不是吗?或者它只是一个字段?我一点也不明白。

对不起,如果我的英语不能接受的话。我很久以前就学过了。既然这个问题已经被问到了,请给我一个建议,在哪里我可以得到关于奥卡姆的最好的信息。最好的,简略的[清晰的].由于阅读了O‘’REILLY,我立即忘记了5分钟前我正在读的东西,因为它永远不清楚作者谈论的这个或那个是用来做什么的。Ocaml与我刚开始使用的Java和JS完全不同。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-19 19:26:46

类型'a Lwt.t的值表示一个线程,一旦它准备好(或者错误是出了问题),该线程将计算为'a类型的值。从'a获取'a Lwt.t的唯一方法是将其绑定到另一个函数,该函数将在'a Lwt.t线程完成并数据准备就绪后立即调用。您可以与Lwt.bind函数绑定,也可以使用infix表示法>>=

例如:

代码语言:javascript
复制
let process_client fd = 
  Lwt_unix.accept fd >>= fun (cli,sock) ->
  let chan = Lwt_io.(of_fd ~mode:output cli) in
  Lwt_io.fprintf chan "hi there, and bye!" >>= fun () ->
  Lwt_io.close chan

这使用了infix表示法,您可以更详细地重写它:

代码语言:javascript
复制
let reply chan = 
  Lwt_io.fprintf chan "hi there, and bye!"

let finish chan = Lwt_io.close chan

let create_chan = Lwt_io.(of_fd ~mode:output cli)

let process_client fd = 
  let accept_t = Lwt_unix.accept fd in
  let chan_t = Lwt.map accept_t create_chan in
  let reply_t = Lwt.bind accept_t reply in 
  Lwt.bind reply_t finish

其中_t指定thread。也就是说,accept_t是一个线程,它最终将返回一对文件描述符和套接字地址。chan_t是一个线程,它将返回一个通道(用于执行缓冲的io)。

Lwt还提供了对特殊语法的支持。实际上,支持两种语法,旧的用camlp4,新的用ppx。在旧语法中,可以按以下方式编写process_client函数:

代码语言:javascript
复制
let process_client fd = 
  lwt (cli,sock) = Lwt_unix.accept fd in
  let chan = Lwt_io.(of_fd ~mode:output cli) in
  lwt () = Lwt_io.fprintf chan "hi there, and bye!" in
  Lwt_io.close chan

lwtlet的一种特殊形式,它不仅将名称绑定到值,而且还等待它们进行计算。

我希望我回答了你们所有的问题。您可能还会发现这个图书馆很有趣。

我没有测试代码,所以如果你有任何问题,请不要犹豫。

为了保持代码简单,我留下了一个适当的shutdown过程。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32102949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档