2011년 2월 18일 금요일

explaining time server in Erlang

http://www.erlang.org/examples/klacke_examples/time_server.erl
%%%----------------------------------------------------------------------
%%% File    : time_server.erl
%%% Author  : Claes Wikstrom <klacke@erix.ericsson.se>
%%% Purpose : 
%%% Created :  3 Nov 1998 by Claes Wikstrom <klacke@erix.ericsson.se>
%%%----------------------------------------------------------------------
%%% 이 예제는 다른 예제보다, 매우 practical하기 때문에 
%%% 초보자는 반드시 이해하면 좋겠다.
-module(time_server).
-author('klacke@erix.ericsson.se').
%%% module 이름과 저자에 대한 명시이다. module은 반드시 명시해야 한다.
-export([start/0, loop0/1]).
%%% 외부에 공개할 인터페이스이다. start와 loop0가 공개가 되고, 
%%% loop0의 arity(인수의 수)는 1이다.
-define(PORTNO, 2345).

start() ->
    start(?PORTNO).
start(Pno) ->
    spawn(?MODULE, loop0, [Pno]).
%%% 시작시 loop0를 실행하는 process를 생성한다.
loop0(Port) ->
    case gen_tcp:listen(Port, [binary, {packet, 0}, {active, false}]) of
 {ok, LSock} ->
     loop(LSock);
 _ ->
     stop
    end.
%%% gen_tcp의 모듈에 있는 listen을 호출하고, 그 결과가 ok이면 LSock을 
%%% 받아서 loop를 호출한다.
%%% 그렇지 않으면 stop한다.
loop(Listen) ->
    case gen_tcp:accept(Listen) of
 {ok, S} ->
     gen_tcp:send(S, io_lib:format("~p~n", [{date(), time()}])),
     gen_tcp:close(S),
     loop(Listen);
 _ ->
     loop(Listen)
    end.

%%% accept가 성공하면, Socket(S)를 받아서 date(),time()을 찍어서 send하고, 
%%% close한다. 그리고 다시 loop를 돈다. 

도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^