2012-10-29 14 views
5

ソケットの受信タイムアウトを設定する方法、私はソケットオプションの男でそれを見つけることができませんでした。
問題への私の最初の解決はの後にを置くことです。Erlangソケットと受信タイムアウト

{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. 

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

答えて

7

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

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

0

も使用できるprim_inet:異なるプロセスから他のメッセージをreceving中にタイムアウトのでTCPメッセージを受信できるようasync_recv/3

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. 
関連する問題