読者です 読者をやめる 読者になる 読者になる

gen_sctp + proc_lib してみた

erlang sctp

そもそも SCTP を理解してないのが問題ですが、とりあえず書いてみました。

gen_sctp:listen が何やってるか理解する必要ありだな。

-module(sctp2_server).

-compile(export_all).

-include_lib("kernel/include/inet.hrl").
-include_lib("kernel/include/inet_sctp.hrl").

start_link() ->
  proc_lib:start_link(?MODULE, init, [self(), any, 2009]).

start_link(Host, Port) when is_list(Host), is_list(Port) ->
  {ok, #hostent{h_addr_list = [IP|_]}} = inet:gethostbyname(Host),
  io:format("~w -> ~w~n", [Host, IP]),
  proc_lib:start_link(?MODULE, init, [self(), IP, Port]).

init(Pid, IP, Port) ->
  proc_lib:init_ack(Pid, {ok, self()}),
  {ok, Socket} = gen_sctp:open([{ip, IP},{port, Port},{recbuf,65536}]),
  io:format("Listening on ~w:~w. ~w~n", [IP, Port, Socket]),
  ok = gen_sctp:listen(Socket, true),
  loop(Socket).

loop(Socket) ->
  case gen_sctp:recv(Socket) of
  {error, Error} ->
    io:format("SCTP RECV ERROR: ~p~n", [Error]);
  Data ->
    io:format("Received: ~p~n", [Data])
  end,
  loop(Socket).