gen_server 使ってみた。

Erlang の OTP の gen_server を使ってみました。
gen_server 使って UDP の echo server を書いてみたところ、
一応書けました。テストはしていません。
動作確認しました。

雰囲気だけでも感じでいただければ:-P

というか、Erlangソースコードって読みやすくないですか?
綺麗にインデントしてあげればそんなにひどくないと思う、多分。

%% vim: fileencoding=utf8 sts=4 sw=4

-module(echo_server).
-behaviour(gen_server).
-compile(export_all).
-export([init/1, handle_call/3,
         handle_cast/2, handle_info/2,
         terminate/2, code_change/3]).

-record(state, {socket, port}).

start_link() ->
    start_link(12345).
start_link(Port) ->
    gen_server:start_link({local, echo_server}, ?MODULE, [Port], []).

init([Port]) ->
    case gen_udp:open(Port, [{active, true}, binary]) of
        {ok, Socket} ->
            {ok, #state{socket=Socket, port=Port}};
        {error, Reason} ->
            {stop, Reason}
    end.

handle_call(Request, From, State) ->
    Reply = ok,
    {reply, Reply, State}.

handle_cast(Request, State) ->
    {noreply, State}.

handle_info({udp, Socket, IP, InPortNo, Packet} = Info, State) ->
    gen_udp:send(State#state.socket, IP, InPortNo, Packet),
    {noreply, State}.

terminate(Reason, State) ->
    gen_udp:close(State#state.socket),
    ok.

code_change(OldVsn, State, Extra) ->
    {ok, State}.