Sockets 运行时编译后Erlang模块不工作
我编写了一个简单的tcp服务器模块并运行良好。当我在运行时编译这个模块时,问题是当客户端向服务器发送任何东西时,它没有收到响应!你怎么能修好它Sockets 运行时编译后Erlang模块不工作,sockets,tcp,erlang,Sockets,Tcp,Erlang,我编写了一个简单的tcp服务器模块并运行良好。当我在运行时编译这个模块时,问题是当客户端向服务器发送任何东西时,它没有收到响应!你怎么能修好它 start(Port) -> {ok, Listen} = gen_tcp:listen(Port, [{active, once}]), spawn(?MODULE, loop, [Listen]). loop(Listen) -> {ok, Socket} = gen_tcp:accept(Listen),
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.
我建议如下:
- 在侦听选项中,将
更改为{active,once}
。您不会在侦听套接字上接收任何消息,也不希望任何已接受的套接字继承活动设置,因为最好让它们在实际准备好处理传入消息时设置活动设置{active,false}
- 在
函数中,将handler/1
调用移动到顶部,在inet:setopts/2
之前。还要将其更改为检查其返回值,如下所示:receive
我怀疑您将它放在了ok = inet:setopts(Socket, [{active, once}]),
消息处理子句下,因为从技术上讲,它只在那里需要,但将它放在顶部不太容易出错。这也是必要的,因为在第一次调用{tcp,…}
时,套接字上没有活动设置,这是我上面建议的第一次更改handler/1
- 在对
的调用中,不需要展平从gen\u tcp:send/2
返回的列表-它返回一个io\u lib:format
,而iolist
可以很好地处理该列表gen\u tcp:send/2