2012-10-29 21 views
5

Yuva için alma zaman aşımı nasıl ayarlanır, soket seçenek adamında bulamadım.
Sorunumun ilk çözünürlüğü, ifadesinden sonra koymaktır. Erlang yuvası ve alma zaman aşımı

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

ama diğer işlem üretmeden zaman aşımı ayarlayabilirsiniz nasıl diğer süreçler gelen mesajlar olduğundan soket zaman aşımı asla?

cevap

7

Etkin mod kullanıyorsanız bir alım zaman aşımı belirtemezsiniz. Zaman aşımı davranışını denetlemeniz gerekiyorsa, soket üzerinde pasif moda geçin, diğer bir deyişle yuva seçeneklerinde {active,false} ve sonra bir zaman aşımı seçeneği ile gen_tcp:recv kullanın. Ayrıca, bir çok Erlang soketi sunucu tasarımları, istemci bağlantısı başına bir Erlang işlemi kullanır. Örnekler için http://www.trapexit.org/Building_a_Non-blocking_TCP_server_using_OTP_principles ve http://20bits.com/article/erlang-a-generalized-tcp-server'u görebilirsiniz. OTP, Erlang ile sağlam sunucular kurmak için birçok harika yol sunar; bundan yararlan!

0

da kullanabileceğiniz prim_inet: Farklı süreçlerden diğer mesajları receving sırasında zaman aşımıyla tcp mesajı almasına izin 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.