2012-10-29 14 views
5

Jak ustawić czas oczekiwania na gniazdo, nie mogłem go znaleźć w opcji socket man.
moim pierwszym rozwiązaniem problemu jest wstawienie po stwierdzeniu.Gniazdo Erlanga i czas oczekiwania na odebranie

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

ale gniazdko nie mogą limit czasu, ponieważ istnieją komunikaty z innych procesów jaki sposób można ustawić limit czasu bez tarła inny proces?

Odpowiedz

7

Nie można określić czasu oczekiwania, jeśli używasz trybu aktywnego. Jeśli chcesz kontrolować zachowanie limitu czasu odbierania, przełącz na tryb pasywny na gnieździe, tj. {active,false} w opcjach gniazd, a następnie użyj opcji gen_tcp:recv z opcją limitu czasu odbioru.

Ponadto wiele projektów serwerów gniazd Erlang korzysta z procesu Erlang na każde połączenie klienta. Możesz zobaczyć przykłady: http://www.trapexit.org/Building_a_Non-blocking_TCP_server_using_OTP_principles i http://20bits.com/article/erlang-a-generalized-tcp-server. OTP zapewnia wiele wspaniałych sposobów budowania solidnych serwerów z Erlang; wykorzystaj to!

0

również można użyć prim_inet: async_recv/3, które pozwalają otrzymać wiadomość tcp z limitu czasu podczas receving inne wiadomości z różnych procesów

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. 
Powiązane problemy