7

如何设置套接字的接收超时,我在套接字选项中找不到它。
我对这个问题的第一个解决方案是放在声明之后

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

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

4

2 回答 2

8

如果您使用活动模式,则无法指定接收超时。如果您需要控制接收超时行为,请在套接字上切换到被动模式,即{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 构建健壮服务器的好方法;好好利用它!

于 2012-10-29T17:19:33.533 回答
0

您也可以使用 prim_inet:async_recv/3 它允许您在接收来自不同进程的其他消息时接收超时的 tcp 消息

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.
于 2012-10-30T23:16:30.267 回答