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.