1

ソースファイル:

-module(biu_server).
-export([start_server/0]).

start_server() -> 
  {ok, Listen} = gen_tcp:listen(1332,
         [binary, {packet, 4},{reuseaddr, true}, {active, true}]),
  spawn(fun() -> par_connect(Listen) end).

par_connect(Listen) ->
     {ok,Socket} = gen_tcp:accept(Listen),
     spawn(fun() -> par_connect(Listen) end),
     loop(Socket).

loop(Socket) ->
    receive
      {tcp, Socket, Request} ->
         gen_tcp:send(Socket, term_to_binary(Request)), 
         loop(Socket);
      {tcp_closed, Socket} ->
         io:format("Server socket closed~n")
    end.

シェルの内側:

  1> c(biu_server).
  {ok,biu_server}
  2> biu_server:start_server().
  <0.40.0>
  3> q().
  ok
  4> {error_logger,{{2016,1,9},{18,40,28}},"Error in process ~p with exit value:~n~p~n",[<0.40.0>,{{badmatch,{error,closed}},[{biu_server,par_connect,1,[{file,"biu_server.erl"},{line,11}]}]}]}

エコー サーバーを作成したいのですが、erlang シェルを終了すると、error_logger が badmatch を警告していますが、クライアント プロセスは既に閉じられています。

サーバーのクローズに失敗するのはなぜですか? 何が起こるのですか?

4

3 に答える 3

0

この問題は解けたのですが、原因がわかりません...

http://erlang.2086793.n4.nabble.com/parallel-tcp-server-closed-once-spawned-td2099538.html

コード:

-module(biu_server).
-export([start_server/0,start/0]).

start() ->
    spawn(fun() -> start_server() end).

start_server() -> 
    {ok, Listen} = gen_tcp:listen(1332,
         [binary, {packet, 4},{reuseaddr, true}, {active, true}]),
    par_connect(Listen).

par_connect(Listen) ->
    {ok,Socket} = gen_tcp:accept(Listen),
    spawn(fun() -> par_connect(Listen) end),
    loop(Socket).

loop(Socket) ->
    receive
    {tcp, Socket, Request} ->
       gen_tcp:send(Socket, term_to_binary(Request)), 
       loop(Socket);
    {tcp_closed, Socket} ->
       io:format("Server socket closed~n")
    end.
于 2016-01-09T12:07:22.283 に答える