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ırinit(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.