2016-04-11 16 views
0

Ich habe einen Client, der N-Prozesse und alle an einen Server wie diese Verbindungs ​​erstellt:gen_tcp: recv/2 gibt Fehler, 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. 

ich viele Client-Verbindungen erschaffe. Irgendwann später könnte der Server mir Daten schicken, also warte ich mit gen_tcp: recv/2, aber ich bekomme {error, einval}.

Gibt es auch ein Problem, wie ich die Steckdosen benutze, da ich beobachte, dass die Steckdosen geschlossen werden, sobald sie akzeptiert werden.

Irgendwelche Eingaben, warum?

Dank

Antwort

5

Standard gen_tcp: Verwendung aktiven Modus, es sei denn, {aktiv, false} angegeben wird, in der Optionsliste für den Sockel, wobei in diesem Fall Pakete abgerufen werden durch den Aufruf recv/2 angeschlossen werden. Verwenden Sie {active, false}, wenn Sie wirklich gen_tcp: recv verwenden möchten, um mit den Daten umzugehen. Bitte überprüfen Sie die Manpages von "gen_tcp" speziell im aktiven Modus relativ.