【问题标题】:Erlang module not working after compile while runningErlang模块在运行时编译后不起作用
【发布时间】:2015-12-20 23:39:39
【问题描述】:

我写了一个简单的 tcp 服务器模块并且运行良好。当我在运行时编译这个模块时,问题是当客户端向服务器发送任何东西时,它没有收到任何响应!怎么解决?

start(Port) ->
    {ok, Listen} = gen_tcp:listen(Port, [{active, once}]),
    spawn(?MODULE, loop, [Listen]).


loop(Listen) ->
    {ok, Socket} = gen_tcp:accept(Listen),
    spawn(?MODULE, loop, [Listen]),
    handler(Socket).



handler(Socket) ->
    receive
        {tcp, Socket, Data} ->
            %io:format("recv ~p~n", [Data]),
            spawn(?MODULE, response, [self(), Data]),
            inet:setopts(Socket, [{active, once}]),
            handler(Socket);
        {tcp_closed, Socket} ->
            %io:format("disconnected~n", []),
            gen_tcp:close(Socket);

        {send_msg, Msg} ->
            gen_tcp:send(Socket, lists:flatten(io_lib:format("~p", [Msg])) ++ ?END_CHAR),
            handler(Socket)
    end.


response(PID, Data) ->
    [Req|Args] = string:tokens(Data, ?END_CHAR),
    {ReqPID, ReqRef} = spawn_monitor(view, request, [list_to_atom(Req), self(), Args]),
    receive
        {'DOWN', ReqRef, process, ReqPID, {function_clause, _}} -> PID ! {send_msg, invalid_request};
        {'DOWN', ReqRef, process, ReqPID, {{case_clause, _}, _}} -> PID ! {send_msg, bad_args};
        {'DOWN', ReqRef, process, ReqPID, {{badmatch, _}, _}} -> PID ! {send_msg, bad_args};
        Resp -> PID ! {send_msg, Resp}
    end.

【问题讨论】:

    标签: sockets tcp erlang


    【解决方案1】:

    我推荐以下:

    • 在您的收听选项中,将 {active,once} 更改为 {active,false}。您不会在侦听套接字上接收任何消息,并且您不希望任何接受的套接字继承活动设置,因为最好让它们在实际准备好处理传入消息时设置活动设置。

    • 在您的handler/1 函数中,将inet:setopts/2 调用移动到顶部,在receive 之前。也改变它来检查它的返回值,像这样:

      ok = inet:setopts(Socket, [{active, once}]),
      

      我怀疑你把它放在{tcp, ...} 消息处理子句下,因为从技术上讲,它只需要在那里,但将它放在顶部不太容易出错。这也是必要的,因为第一次调用handler/1 时套接字上没有活动设置,鉴于我在上面推荐的第一个更改。

    • 在您对gen_tcp:send/2 的调用中,无需展平从io_lib:format 返回的列表——它返回一个iolistgen_tcp:send/2 可以处理得很好。

      李>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-08
      • 2018-06-14
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 2018-08-28
      相关资源
      最近更新 更多