-module(server). -export([start/1,stop/0]). -define(TCP_OPTIONS,[binary, {packet, 0}, {active, false}, {reuseaddr, true}]). start(Port) -> Pid = spawn(fun() -> manage([]) end), register(client_manager, Pid), {ok, Socket} = gen_tcp:listen(Port, ?TCP_OPTIONS), accept(Socket). stop() -> todo. accept(Socket) -> {ok, NewSocket} = gen_tcp:accept(Socket), spawn(fun() -> recieve(NewSocket) end), client_manager ! {connected, NewSocket}, accept(Socket). recieve(Socket) -> case gen_tcp:recv(Socket, 0) of {ok, Data} -> client_manager ! {multicast,Socket,Data}, recieve(Socket); {error, closed} -> client_manager ! {disconnect, Socket} end. manage(Sockets) -> receive {connected, Socket} -> NewSockets = [Socket | Sockets]; {disconnected, Socket} -> NewSockets = lists:delete(Socket, Sockets); {multicast,Socket, Data} -> multicast(Socket, Sockets, Data), NewSockets = Sockets end, manage(NewSockets). multicast(FromSocket, ToSockets, Data) -> SendData = fun(Socket) -> gen_tcp:send(Socket, Data) end, Sockets = [ S || S <- ToSockets, S /= FromSocket], lists:foreach(SendData, Sockets).