Gen_tcp через сокет gen_server немедленно закрывается

Я хочу использовать gen_tcp вместо gen_server, вот код:

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, и я правда не понимаю, почему.

Если я перемещаю код 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

person J.R.    schedule 28.07.2015    source источник
comment
Это несколько работает для меня. Может быть, ваш порт просто занят?   -  person Lol4t0    schedule 28.07.2015
comment
Нет, пробовал с разными портами. Слушатель и тут же слез!   -  person J.R.    schedule 28.07.2015
comment
Ну как понять, что слушатель не работает?   -  person Lol4t0    schedule 28.07.2015
comment
@ Lol4t0 Я отредактировал ответ! Спасибо!   -  person J.R.    schedule 28.07.2015
comment
Хм, может быть, тогда вы получите что-то, потому что ваш код будет падать сразу после получения любого сетевого сообщения (потому что вы возвращаете Socket вместо #state{} из обработчика приведения   -  person Lol4t0    schedule 28.07.2015
comment
То, что вы пытаетесь сделать, в любом случае не сработает, потому что gen_tcp:accept блокирует, что означает, что ваша функция handle_cast будет блокировать весь процесс gen_server до тех пор, пока не будет установлено соединение.   -  person Steve Vinoski    schedule 28.07.2015


Ответы (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}.

Проблема заключалась в параметре «Состояние».

Спасибо тебе за все

person J.R.    schedule 28.07.2015