2016-04-07 11 views
1

Ich habe einen TCP-Server (Echo-Server) akzeptiert Verbindungen. Ich habe einen Klienten, der, wenn er einen Parameter N erhält, jene vielen Prozesse erzeugt, die versuchen, sich mit dem tcp Listener zu verbinden. Ich bin in der Lage, eine Verbindung mit diesen Sockets herzustellen, aber ich kann viele Sockets sehen, die geschlossen sind, was offensichtlich ist, da ich einen Echo-Server verwende. Ich erhalte keine Nachrichten, die ich gesendet habe.TCP-Server und Client-Interaktion

Hier ist der Servercode (wichtiger Teil)

init(State = #state{port = Port}) -> 
ets:new(csockets, [ordered_set, named_table, public]), 
ets:insert(csockets, {sockets, []}), 
case gen_tcp:listen(Port, ?TCP_OPTIONS) of 
    {ok, LSocket} -> 
    NewState = State#state{lsocket = LSocket}, 
    spawn(fun() -> accept(NewState) end), 
    {ok, NewState}; 
    {error, Reason} -> 
    {stop, Reason} 
    end. 


    accept(State = #state{lsocket = LSocket}) -> 
    case gen_tcp:accept(LSocket) of 
    {ok, Socket} -> 
    {sockets, List} = hd(ets:lookup(csockets, sockets)), 
    NewList = [Socket | List], 
    ets:insert(csockets, {sockets, NewList}), 
    Pid = spawn(fun() -> 
    loop(Socket) 
       end), 
    gen_tcp:controlling_process(Socket, Pid), 
    accept(State); 
    {error, closed} -> State 
    end. 


    loop(Socket) -> 
    case gen_tcp:recv(Socket, 0) of 
    {ok, Data} -> 
    gen_tcp:send(Socket, Data), 
    loop(Socket); 
    {error, closed} -> 
    io:format("CLOSED ~n"), %% This asserts for many sockets 
    ok 
    end. 

Client, der mit dem Server verbindet. Erstellen von N Prozessen, die eine Verbindung zum Server herstellen und dann den zurückgegebenen Socket für die Kommunikation verwenden.

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

     loop({IP, Port}, Low) -> 
     case gen_tcp:connect(IP, Port, [binary, {active, true}]) of 
     {ok, Socket} -> 
     io:format("~p Connected ~n", [Low]), 
     gen_tcp:send(Socket, "Hi"), 
     receive 
     {tcp, RecPort, Data} -> 
     io:format("I have received ~p on port ~p ~n", [Data, RecPort]) 
     end; 
     _Else -> 
     io:format("The connection failed ~n") 
     loop({IP, Port}, Low) 
     end. 

Antwort

1

Der Fehler ist auf dem Server, Sie Muster sind ein messa wie dies auf einem tcp passende geschlossen:

{error, closed} 

aber wenn Sie den documentantion für gen_tcp gehen, werden Sie feststellen, dass Sie sollten Muster entsprechen diese Meldungen:

{tcp_closed, Socket} 
{tcp_error, Socket, Reason} 

aktualisieren Sie Ihren Code mit:

loop(Socket) -> 
    case gen_tcp:recv(Socket, 0) of 
     {ok, Data} -> 
      gen_tcp:send(Socket, Data), 
      loop(Socket); 
     {tcp_error, Socket} -> 
      io:format("CLOSED ~n"), %% This asserts for many sockets 
      ok 
    end. 

und Sie sollten beginnen, die Zeichenfolge GESCHLOSSEN auf Ihrem Bildschirm

zu bekommen
Verwandte Themen