2016-04-07 4 views
1

У меня есть сервер tcp (echo server), принимающий соединения. У меня есть клиент, который при задании параметра N создает много процессов, пытающихся подключиться к прослушивателю tcp. Я могу подключиться к этим сокетам, но я вижу, что многие сокеты закрыты, что очевидно, так как я использую эхо-сервер, я не получаю сообщения, которые я отправил.tcp сервер и взаимодействие с клиентом

Вот код сервера (критическая часть)

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. 

Клиент, который подключается к серверу. Создание N процессов, которые подключаются к серверу, а затем использовать возвращенный сокет для связи.

 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. 

ответ

1

Ошибка на сервере, вы шаблон сопрягать Мессы, как это на ТСР закрыт:

{error, closed} 

, но если вы идете в documentantion для gen_tcp, вы заметите, что вы должны шаблон матч эти сообщения:

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

Обновить код с:

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. 

и вы должны начать получать строку ЗАКРЫТО на вашем экране

 Смежные вопросы

  • Нет связанных вопросов^_^