Erlang模块在运行时编译后不起作用
Posted
技术标签:
【中文标题】Erlang模块在运行时编译后不起作用【英文标题】:Erlang module not working after compile while running 【发布时间】: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.
【问题讨论】:
【参考方案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
返回的列表——它返回一个iolist
,gen_tcp:send/2
可以处理得很好。
【讨论】:
以上是关于Erlang模块在运行时编译后不起作用的主要内容,如果未能解决你的问题,请参考以下文章