3

N 個のプロセスを作成し、すべて次のようにサーバーに接続するクライアントがあります。

 send(State = #state{low = Low, high = Low}) ->
 NewState = receive_sockets(0, Low, State),
 NewState;
 send(State = #state{low = Low}) ->
   N = Low rem 10,
   Dest = lists:nth(N + 1, State#state.dest),
   spawn(?MODULE, loop, [self(), Dest, Low]),
   NewState = State#state{low = Low + 1},
   send(NewState).

 loop(From, {IP, Port}, Low) ->
   case gen_tcp:connect(IP, Port, [binary]) of
    {ok, Socket} ->
    gen_tcp:send(Socket, integer_to_binary(Low)),
    From ! {Low, Socket},
    loop1(Socket);
    %%timer:sleep(infinity);
   _Else ->
    io:format("The connection failed ~n"),
    loop(From, {IP, Port}, Low)
   end.

 loop1(Socket) ->
  case gen_tcp:recv(Socket, 0) of
   {ok, Data} ->
    io:format("Received ~n ~p", [Data]),
    loop1(Socket);
   {error, einval} ->
    io:format("error ~n")
 end.

多くのクライアント接続を作成しています。しばらくして、サーバーからデータが送信される可能性があるため、gen_tcp:recv/2 を使用してそれを待っていますが、{error, einval} が発生します。

また、ソケットが受け入れられるとすぐに閉じられることを観察しているため、ソケットの使用方法に問題はありますか。

理由についての入力はありますか?

ありがとう

4

1 に答える 1

6

デフォルトの gen_tcp:connect は、ソケットのオプション リストで {active, false} が指定されていない限り、アクティブ モードを使用します。この場合、パケットは recv/2 を呼び出して取得されます。本当に gen_tcp:recv を使用してデータを処理したい場合は、{active, false} を使用してください。「gen_tcp」、特にアクティブ モード相対のマニュアル ページを再確認してください。

于 2016-04-11T07:36:17.073 に答える