2016-04-07 33 views
1

Bağlantıları kabul eden bir tcp sunucum (eko sunucusu) var. Bir parametre N verildiğinde, tcp dinleyicisiyle bağlantı kurmaya çalışan birçok işlemi oluşturan bir istemcim var. Bu soketlere bağlanabiliyorum ancak bir çok eko sunucusu kullandığımdan belli olan çok sayıda soketin kapalı olduğunu görebiliyorum, gönderdiğim iletileri geri almıyorum. İşte tcp sunucusu ve istemci etkileşimi

sunucu kodu (önemli bir parçası) sunucusuna bağlanır

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. 

Müşteri. Sunucuya bağlanan N süreçleri oluşturma ve daha sonra iletişim kurmak için döndürülen soketi kullanma. Eğer gen_tcp için documentantion giderseniz

{error, closed} 

ama, size gerektiği göreceksiniz:

 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. 

cevap

1

hata, bir tcp üzerinde böyle bir Messa eşleşen deseni kapalı olan, sunucu üzerinde olduğunu desen maç bu mesajlar:

:

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

Güncelleme ile kod

ve ekranınızda KAPALI dize almaya başlamalı