gen_server套接字上的Gen_tcp立即关闭

时间:2015-07-28 06:07:33

标签: erlang otp gen-server gen-tcp

我想在gen_server上使用gen_tcp,这里是代码:

start_link() ->
 io:format("start_link~n"),
 gen_server:start_link({global, ?MODULE}, ?MODULE, [], []).

init([])  ->
 {ok,ListenSocket} = gen_tcp:listen(8091, [{active,true}, binary]),
 io:format("listen done ~p ~p pid: ~p ~n",[ok,ListenSocket,self()]),
 %here the listen is closed
 waitConnection(),
 {ok,#state{listenSocket = ListenSocket}}.

handle_cast(waitConnection, #state{listenSocket = ListenSocket}) ->
 io:format("cast wait connections ~p pid:~p   ~n",[ListenSocket,self()]),
 {ok,Socket} = gen_tcp:accept(ListenSocket),
 io:format("cast wait accept ~n"),
 Pid = spawn(?MODULE,get_request,[Socket,[]]),
 gen_tcp:controlling_process(Socket,Pid),
 waitConnection(),
 {noreply, ListenSocket}.

waitConnection() ->
 try gen_server:cast({global, ?MODULE}, waitConnection)
 catch
   exit:{_,_} -> io:format("errror")
 end.

好吧,tcp_listener会在waitConnetion之前立即关闭,我真的不明白为什么。

如果我在init部分移动handle_cast代码,它可以正常工作。

为何关闭连接?我花了很多时间没有成功。

感谢任何帮助。

修改

如果我在监听器之后移动强制转换代码:

lsof -i :8091
    COMMAND   PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
    beam.smp 6402 JR   24u  IPv4 0x9544c4111122e613      0t0  TCP *:8091 (LISTEN)

我发布的代码:

lsof -i :8091
// is empty

1 个答案:

答案 0 :(得分:0)

好的,我解决了:

()

问题在于"州"参数。

谢谢大家