2009-11-12 27 views
1

有谁知道如何在Mochiweb应用程序中启用活动代替被动套接字。具体来说,我试图修改http://www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-2,这样当客户端断开时,它会立即“注销”。如何启用Mochiweb应用程序中的活动套接字?

我已经尝试设置:

start(Options) -> 
    {DocRoot, Options1} = get_option(docroot, Options), 
    Loop = fun (Req) -> 
     Socket = Req:get(socket), 
     inet:setopts(Socket, [{active, once}]), 
     ?MODULE:loop(Req, DocRoot) 
    end, 

,但似乎无法正常工作。发送新消息后,我仍然只会在我的receive中收到更新。

想法?谢谢!

+0

您可以扩展您为什么需要{active,once}模式来检测客户端断开连接吗?被动与主动模式是关于如何使用套接字,而不是从中获得什么级别的信息。 – Christian

+0

基督徒,在被动模式下,当您尝试返回数据(或从套接字读取更多内容)时,您只会发现客户端已断开连接。 – inklesspen

回答

0

我解决了这个问题,我的Erlang彗星应用程序,其中的一部分,我在this blog post显示。基本上,您不希望套接字始终处于活动模式;在阅读客户的请求之后并在返回响应之前,您只需要它处于活动模式。

以下是样本请求处理程序:

comet(Req) -> 
    Body = Req:recv_body(), 
    io:format("~nBody: ~p~n", [Body]), 
    Socket = Req:get(socket), 
    inet:setopts(Socket, [{active, once}]), 
    Response = connection:handle_json(Body), 
    inet:setopts(Socket, [{active, false}]), 
    io:format("~nSending Response: ~s~n", [Response]), 
    Req:ok({"application/json", [], Response}). 

的IO:格式呼叫只是控制台登录为我好。最重要的部分是在从请求中读取正文后,在调用包含请求和返回数据的函数之前,我在套接字上设置{active,once}。我也关闭了主动模式;套接字可以在某些HTTP模式下重用。

+0

你能解释一下你的解决方案和将套接字保留为false,以及在'connection:handle_request'中使用''OK',Packet}的Response = case gen_tcp:recv(Socket,0) - > ..“ 。; {'error','closed'} - > ... end.'? – Zed

相关问题