All pastes #1822858 Raw Edit

Mine

public text v1 · immutable
#1822858 ·published 2010-03-04 17:43 UTC
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}.