问题gen_tcp:接受
问题描述:
我做了一个tcp服务器产生一个进程监听传入的连接。下面是示例代码(从我的原代码中删除了一些东西):问题gen_tcp:接受
模块:
main([]) ->
{ ok, Pid } = b:start(),
receive
_ ->
ok
end.
模块B:
-define(TCP_OPTIONS, [binary, { active, false}, { packet, 0 } , {reuseaddr, true}]).
...
start_link(Port) ->
Pid = spawn_link(server_listener, init, [ Port ]),
{ ok , self() }.
init(Port, Processor) ->
case gen_tcp:listen(Port, ?TCP_OPTIONS) of
{ ok , LSocket } ->
accept_loop(LSocket);
{ error, Reason } ->
{ stop, Reason }
end.
accept_loop(LSocket) ->
?LOG("Current socket acceptor PID [~w]~n", [self()]),
case gen_tcp:accept(LSocket) of
{ ok, Socket } ->
%do stuff here
spawn(server_listener , accept_loop, [ LSocket ]);
{ error, Reason } ->
?LOG("Error accepting socket! [ ~s ]~n", [ Reason ])
end.
的问题是:每一次当我尝试在此端口上从telnet连接,我在gen_tcp:accept上收到错误{error,closed}。这已经迫使我试图弄清楚发生了什么。
感谢,
答
你“接受环”是不是一个真正的环...它是人为的。
您可能想要“do_accept_loop”和适当的“server_loop”来处理连接。看看this。
你想沿着线的东西:
% Call echo:listen(Port) to start the service.
listen(Port) ->
{ok, LSocket} = gen_tcp:listen(Port, ?TCP_OPTIONS),
accept(LSocket).
% Wait for incoming connections and spawn the echo loop when we get one.
accept(LSocket) ->
{ok, Socket} = gen_tcp:accept(LSocket),
spawn(fun() -> loop(Socket) end),
accept(LSocket).
% Echo back whatever data we receive on Socket.
loop(Socket) ->
case gen_tcp:recv(Socket, 0) of
{ok, Data} ->
gen_tcp:send(Socket, Data),
loop(Socket);
{error, closed} ->
ok
end.
@scooterman:我已经提供了我的答案的链接。在你的'init'函数中,你调用'accept_loop',但你应该做的是调用一个为这个连接产生一个服务器的函数。这就是为什么我根据'do_accept'提出了一些建议。 此外,你需要一个适合你的衍生服务器的“循环”功能。你的'accept_loop'根本不*循环*。看看我提供的链接。 – jldupont 2009-11-30 18:49:49
哈哈,你比我快。看看你的例子,我改变了“spawn(server_listener,accept_loop,[LSocket]);” (就在这里做%的东西)“accept_loop(LSocket)”,它的工作!所以我认为产卵电话比我当前的进程退出慢,使得我的接受套接字在新套接字开始前关闭。谢谢! – scooterman 2009-11-30 18:54:53