Erlang套接字和接收超时

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)

但是套接字可能永远不会超时,因为有来自其他进程的消息如何设置超时而不产生其他进程?

dcg*_*ons 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构建健壮服务器的好方法; 利用它!