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

prim_inet:async_recv を途中まで調べた。

erlang

需要って相当少ない気がする。
あ、動きません。
prim_inet:async_connect というのもあるので、負荷テストクライアント作るときとか便利そう。

prim_inet.erl は良く読む必要あり。

% prim_inet:async_recv
-record(state, {sock, recv_ref, callback})

start_link() ->
  {ok, proc_lib:spawn_link(?MODULE, init, [self()])}.

init(Parent) ->
  receive
    {start, Sock} ->
      start_connection(Parent, Sock)
  end.

start_connection(Parent, ClientSock) ->
  process_flag(trap_exit, true),
  try
    % Socket, Length, Timeout
    {ok, Ref} = prim_inet:async_recv(Socket, 0, -1),
    main_loop(#state{sock=ClientSock, recv_ref=Ref})
  catch
    Exception ->
      error
  after
    error
  end.

main_loop(State=#state{sock=Sock, recv_ref=Ref}) ->
  receive
    {inet_async, Sock, Ref, {ok, Data}} ->
      main_loop(State);
    {inet_async, Sock, Ref, {error, Reason}} ->
      throw({inet_error, Reason})
  end.