2016-04-11 3 views
0

私はN・プロセスを作成し、すべてのこのようなサーバーに接続するクライアントを持っている:gen_tcp:RECV/2を返すエラー、EINVAL

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}を取得します。

また、ソケットが受け入れられるとすぐに閉じられていることを確認しているので、ソケットをどのように使用しているかは問題ありません。

理由は何ですか?

おかげ

答えて

5

デフォルトgen_tcp:{活性、偽}はパケットがRECV/2を呼び出すことによって取得された場合には、ソケット用のオプションリストで指定されていない限り、使用アクティブモードを接続。 gen_tcp:recvを実際に使用してデータを処理するには、{active、false}を使用します。 "gen_tcp"のmanページ、特にアクティブモードを再確認してください。

関連する問題