7

ソケットの受信タイムアウトを設定する方法は、ソケット オプション man で見つかりませんでした。
問題に対する私の最初の解決策は、文の後に置くことです。

{ok, Listen} = gen_tcp:listen(Port, [..,{active, once}...]),
{ok, Socket} = gen_tcp:accept(Listen),
loop(Socket).
loop(Socket) ->
  receive
     {tcp, Socket, Data} ->
        inet:setopts(Sock, [{active, once}]),
        loop(Socket);
     {tcp_closed, Socket} -> closed;
     Other -> process_data(Other)
  after 1000 -> time_out
  end.

しかし、他のプロセスからのメッセージがあるため、ソケットがタイムアウトしない場合があります。他のプロセスを生成せずにタイムアウトを設定するにはどうすればよいですか?

4

2 に答える 2

8

アクティブモードを使用している場合、受信タイムアウトを指定することはできません。受信タイムアウトの動作を制御する必要がある場合は、ソケット、つまり{active,false}ソケットオプションでパッシブモードに切り替えてからgen_tcp:recv、受信タイムアウトオプションとともに使用します。

さらに、Erlangソケットサーバーの設計の多くは、クライアント接続ごとにErlangプロセスを使用します。例については、 http://www.trapexit.org/Building_a_Non-blocking_TCP_server_using_OTP_principlesおよびhttp://20bits.com/article/erlang-a-generalized-tcp-serverを参照してください。OTPは、Erlangを使用して堅牢なサーバーを構築するための多くの優れた方法を提供します。それを利用してください!

于 2012-10-29T17:19:33.533 に答える
0

また、prim_inet:async_recv/3 を使用することもできます。これにより、さまざまなプロセスから他のメッセージを受信しながら、タイムアウト付きの tcp メッセージを受信できます。

read(Socket) ->
prim_inet:async_recv(Socket, 0, 1000),
receive
    {inet_async, _ ,_ ,{ok, Msg}} ->
        io:format("message received ~p~n",[Msg]),
        read(Socket);
    {inet_async,_,_,{error,timeout}} ->
        io:format("timeout !"),
        catch gen_tcp:close(Socket);
    {fake, Msg} -> io:format("Message = ~p~n", [Msg]),
                   read(Socket)
end.
于 2012-10-30T23:16:30.267 に答える