rendered paste body-module(connector).
-export([start/0]).
start() ->
{ok, L} = gen_tcp:listen(4444, [binary, {packet, 0}, {active, false}]),
register(master, self()),
Pid = spawn(fun () -> accept_observers(L) end),
register(spawner, Pid),
{ok, S} = gen_tcp:connect("localhost",
3333,
[binary, {packet, 0}]),
loop(S, []).
loop(Socket, Observers) ->
receive
{tcp, S, D} ->
forward(D, Observers),
loop(Socket, Observers);
{tcp_closed, S} ->
die(Observers),
exit;
{tcp_error, S, Reason} ->
error_logger:error_msg(Reason);
{add_observer, Pid} ->
loop(Socket, [Pid|Observers]);
{die} ->
ok
end.
broadcast(What, [H|Who]) ->
H ! What,
broadcast(What, Who);
broadcast(What, []) ->
ok.
forward(Data, Observers) ->
broadcast({data,Data}, Observers).
die(Observers) ->
broadcast({die}, Observers).
accept_observers(LSock) ->
{ok, S} = gen_tcp:accept(LSock),
Pid = spawn(fun () -> dispatch(S) end),
gen_tcp:controlling_process(S, Pid),
master ! {add_observer, Pid},
accept_observers(LSock).
dispatch(Sock) ->
receive
{data, Data} ->
gen_tcp:send(Sock, Data),
dispatch(Sock);
{tcp_closed, S} ->
exit;
{tcp_error, S, Reason} ->
error_logger:error_msg(Reason);
{die} ->
gen_tcp:close(Sock),
exit
end.
stop() ->
master ! {die}.