2012-10-29 115 views
5

如何設置套接字的接收超時,我無法在套接字選項man中找到它。
我的第一個解決問題的辦法是在聲明後放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:async_recv/3,讓你可以接收TCP消息超時,同時從不同的工藝receving其它消息

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.