UDP エコーサーバ

とりあえずは動いたので載せておく。
日本語は通らない、というか Erlang での日本語処理を理解していない。
さらに大文字も通らない "HIGE" はだめ。
はっきりいって、全然その編を理解していないので、そのうち書き換えます。


ターミナル1

> c(udp_echo).
> udp_echo:start_echo_server().
<0.38.0>
server opend socket:#Port<0.133>
server rececived:{udp,#Port<0.133>,
                      {127,0,0,1},
                      50778,
                      <<131,107,0,4,104,105,103,101>>}
Server replying = hige

ターミナル2

> c(udp_echo).
> udp_echo:echo_client("hige").
client opened socket=#Port<0.135>
client received:{udp,#Port<0.135>,
                     {127,0,0,1},
                     4000,
                     <<131,107,0,4,104,105,103,101>>}
"hige"

udp_echo.erl

% vim: sw=4 sts=4
-module(udp_echo).
-compile(export_all).

%% The echo server
start_echo_server() ->
    spawn(fun() -> echo_server(4000) end).

echo_server(Port) ->
    {ok, Socket} = gen_udp:open(Port, [binary]),
    io:format("server opend socket:~p~n", [Socket]),
    loop(Socket).

loop(Socket) ->
    receive
        {udp, Socket, Host, Port, Packet} = Msg ->
            io:format("server rececived:~p~n", [Msg]),
            Reply = binary_to_term(Packet),
            io:format("Server replying = ~p~n", [Reply]),
            gen_udp:send(Socket, Host, Port, Packet),
            loop(Socket)
    end.

%% The echo client
echo_client(Str) ->
    {ok, Socket} = gen_udp:open(0, [binary]),
    io:format("client opened socket=~p~n",[Socket]),
    ok = gen_udp:send(Socket, "localhost", 4000, 
		      term_to_binary(Str)),
    Value = receive
                {udp, Socket, _, _, Packet} = Msg ->
                    io:format("client received:~p~n",[Msg]),
                    binary_to_term(Packet)
            % timeout
            after 2000 ->
                    0 
            end,
    gen_udp:close(Socket),
    Value.

追記

HIGE にも対応しました。
普通に binary_to_term でいいのね ... 。