sockets - Erlang套接字和接收超时

标签 sockets erlang timeout

如何为套接字设置接收超时,我在套接字选项手册中找不到它。
我对这个问题的第一个解决方案是把 陈述。

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

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

最佳答案

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

关于sockets - Erlang套接字和接收超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13125079/

相关文章:

c - 如何在 C 中给客户端特定的 ip 地址

python - 为什么在 Windows 上无需设置 SO_REUSEADDR 就可以立即重用 tcp 套接字地址?

erlang - 编写 Erlang timeit 函数

erlang - 是否有一种 Erlang 行为可以自行行动而不是等待被调用?

php - CakePHP 的授权超时问题

android - GCM : how to avoid throttling

android - 我的广播接收器未在多线程应用程序中注册

erlang - 使用 websocket(Erlang、RabbitMQ、Websocket、Gen_bunny、Cowboy)向所有连接的用户广播消息

c - Openssl BIO_read 不返回

PHPUnit 严格模式 - 如何更改默认超时