-module(chat).
-export([start/2, init/2]).
start(PortNo, To) when is_integer(PortNo) ->
spawn_link(?MODULE, init, [PortNo, To]).
init(PortNo, ToHost) ->
spawn(?MODULE, receive_start, [PortNo]),
spawn(?MODULE, send_start, [ToHost, PortNo]).
receive_start(PortNo) ->
{ok, ListenSock} = gen_tcp:listen(PortNo, [{resuseaddr, true}, {packet, 0}, {active, true}]),
spawn(fun() -> receive_connect(ListenSock) end).
receive_connect(ListenSocket) ->
{ok, Sock} = gen_tcp:accept(ListenSocket),
spawn(fun() -> receive_connect(ListenSocket) end),
receive_chat_msg(Sock).
receive_chat_msg(Socket) ->
receive
{tcp, Socket, Bin} ->
case inet:peername(Socket) of
{ok, {Addr, Port}} ->
io:format("From = ~p,~p: ~p~n", Addr, Port, binary_to_term(Bin));
{error, Why} ->
exit(Why)
end;
receive_chat_msg(Socket);
{tcp_closed, Socket) -> void
end.
send_start(ToHost, PortNo) ->
{ok, Socket} = gen_tcp:connect(ToHost, PortNo, [binary, {}]),
send_chat_msg(Socket).
send_chat_msg(Socket) ->
%% how to get line from stdin?
ok = gen_tcp:send(Socket, term_to_binary(Msg),
send_chat_msg(Socket).