use*_*906 6 sockets erlang timeout
如何为socket设置接收超时,我在socket选项man中找不到它.
我对问题的第一个解决方案就是把声明放在后面.
{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.
Run Code Online (Sandbox Code Playgroud)
但是套接字可能永远不会超时,因为有来自其他进程的消息如何设置超时而不产生其他进程?
如果使用活动模式,则无法指定接收超时.如果需要控制接收超时行为,请在套接字上切换到被动模式,即{active,false}
在套接字选项上,然后使用gen_tcp:recv
接收超时选项.
此外,许多Erlang套接字服务器设计每个客户端连接都使用Erlang进程.您可以参见http://www.trapexit.org/Building_a_Non-blocking_TCP_server_using_OTP_principles和http://20bits.com/article/erlang-a-generalized-tcp-server作为示例.OTP提供了许多使用Erlang构建健壮服务器的好方法; 利用它!