【问题标题】:Gen_tcp over gen_server socket listen closed immediatlyGen_tcp over gen_server socket 监听立即关闭
【发布时间】:2015-10-18 13:11:00
【问题描述】:

我想在 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_listenerwaitConnetion 之前立即关闭,我真的不明白为什么。

如果我在 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

【问题讨论】:

  • 这有点适合我。可能是你的港口很忙吗?
  • 不,我尝试使用不同的端口。听者立马就下来了!
  • 嗯,你是怎么理解那个监听器的?
  • @Lol4t0 我编辑了答案!谢谢!
  • 嗯,你可能会收到 smth,因为你的代码会在收到任何网络消息后立即崩溃(因为你从演员处理程序返回 Socket 而不是 #state{}

标签: erlang erlang-otp gen-server gen-tcp


【解决方案1】:

好的,我解决了:

handle_cast(waitConnection, State = #state{listenSocket = ListenSocket}) ->
    io:format("ListenSocket ok ~n"),
    {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, State}.

问题出在“状态”参数上。

谢谢大家

【讨论】:

    猜你喜欢
    • 2011-11-09
    • 2012-10-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    相关资源
    最近更新 更多