Помогите понять отчет об ошибках - PullRequest
3 голосов
/ 14 августа 2011

Может кто-нибудь объяснить, почему я получаю следующую ошибку при запуске: erl -noshell -s simple_server, а затем telnet 127.0.0.1 1084? Сам код находится ниже сообщения об ошибке.

= ОТЧЕТ ОБ ОШИБКАХ ==== 13-августа-2011 :: 23: 12: 05 === Ошибка в процессе <0.30.0> с выходным значением: {{Badmatch, {ошибка, закрытый}}, [{simple_server, wait_accept, 1}]}

  -module(simple_server).
  -compile(export_all).

  start() ->
      {ok, ListenSoc} = gen_tcp:listen(1084, [binary, {active, false}]),
      wait_accept(ListenSoc).

   wait_accept(ListenSoc) ->
      {ok, Socket} = gen_tcp:accept(ListenSoc),
      spawn(?MODULE, wait_accept, [ListenSoc]),
      send_resp(Socket).

  send_resp(Socket) ->
      gen_tcp:send(Socket, "Response from simple server...\n"),
      ok = gen_tcp:close(Socket).

Ответы [ 2 ]

4 голосов
/ 14 августа 2011

Эта вещь:

{{badmatch,{error,closed}},
 [{simple_server,wait_accept,1}]}

должна читаться как: "Мы находимся в simple_server: wait_accept / 1", и мы получили ошибку несоответствия (см. http://www.erlang.org/doc/reference_manual/errors.html#id81191). Это означает, что наше выражение соответствия

{ok, Socket} = gen_tcp:accept(ListenSock),

вернул {error, closed} (так как это единственное выражение совпадения в этой функции, это просто). Почему оно вернулось, это немного мутно для меня. Лучше всего, если процесс вызывает *Функция 1010 * была прервана, а затем прослушивающий сокет был закрыт из-за этого завершения (это происходит автоматически). Обратите внимание, что ошибка в оболочке erlang перезапустит его и, как таковое, закроет прослушивающий сокет.

3 голосов
/ 14 августа 2011

Когда создается сокет, он связывается с текущим процессом, который называется процессом управления сокетом. Когда процесс управления завершается, все связанные сокеты просто закрываются. В вашем случае ListenSoc закрывается, когда send_resp() закончено (поэтому процесс управления сокетом завершен), а gen_tcp:accept(ListenSoc) во вновь созданном процессе возвращает {error, closed}.

Самое простое решение - добавить вызов к gen_tcp: contorolling_process / 2 в wait_accept следующим образом:

...
Pid = spawn(?MODULE, wait_accept, [ListenSoc]),
ok = gen_tcp:controlling_process(ListenSoc, Pid),
...

Но в реальных проектах лучше использовать цикл управления прослушивающими сокетами. Вы можете получить представление из Nicolas Buduroi ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...