Проблемы gen_tcp: принять - PullRequest
0 голосов
/ 30 ноября 2009

Я заставил 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 к этому порту, я получаю сообщение об ошибке {error, closed} в gen_tcp: accept. Это уже сводит меня с ума, пытаясь понять, что происходит.

Спасибо

1 Ответ

2 голосов
/ 30 ноября 2009

Ваш "цикл принятия" на самом деле не цикл ... и он придуман.

Вы, вероятно, хотите "do_accept_loop" и правильный "server_loop" для обработки соединения. Посмотрите на это .

Вы хотите что-то вроде:

% 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...