December 21th Monday 2009

-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).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值