2012-10-29 80 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.