Denek
unread,Nov 19, 2009, 3:34:28 PM11/19/09Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to Erlang в России
-module(chat).
-export([start/1]).
-define(TCP_OPTIONS, [list, {packet, 0}, {active, false}, {reuseaddr,
true}]).
start(Port) ->
Pid = spawn(fun() -> manage_clients([]) end),
register(client_manager, Pid),
{ok, LSocket} = gen_tcp:listen(Port, ?TCP_OPTIONS),
do_accept(LSocket).
do_accept(LSocket) ->
{ok, Socket} = gen_tcp:accept(LSocket),
spawn(fun() -> handle_client(Socket) end),
client_manager ! {connect, Socket},
do_accept(LSocket).
handle_client(Socket) ->
case gen_tcp:recv(Socket, 0) of
{ok, Data} ->
Policy = string:str(Data, "<policy-file-request/>"),
case Policy of
1 ->
io:fwrite("Policy request~n"),
{ok, Cross} = file:read_file('crossdomain.xml'),
CrossNew = lists:append(binary_to_list(Cross), [0]),
gen_tcp:send(Socket, CrossNew);
0 ->
%% io:fwrite("~s~n", [Data]),
client_manager ! {data, Data}
end,
handle_client(Socket);
{error, closed} ->
client_manager ! {disconnect, Socket}
end.
manage_clients(Sockets) ->
receive
{connect, Socket} ->
io:fwrite("Socket connected: ~w~n", [Socket]),
NewSockets = [Socket | Sockets];
{disconnect, Socket} ->
io:fwrite("Socket disconnected: ~w~n", [Socket]),
NewSockets = lists:delete(Socket, Sockets);
{data, Data} ->
send_data(Sockets, Data),
NewSockets = Sockets
end,
manage_clients(NewSockets).
send_data(Sockets, Data) ->
SendData = fun(Socket) ->
gen_tcp:send(Socket, Data)
end,
lists:foreach(SendData, Sockets).
Вот и я начал свой путь в мир Erlang'a, и сразу столкнулся с
непоняткой:
Вот есть такой исходный код echo сервера, при 100 активных соединениях
и активном флуде каждым клиентом, современем (в процессе работы сразу)
начинает течь память, может программа неправильно построена