在哪种情况下我们应该在Erlang中使用混合方法套接字?

时间:2015-08-17 11:36:57

标签: sockets erlang

Programing Erlang在第17.2章中说。

  

Erlang套接字可以以三种模式之一打开:活动,活动一次或被动

...

  

您可能认为对所有服务器使用被动模式是正确的方法。不幸的是,当我们处于被动模式时,我们只能等待来自一个套接字的数据。这对于编写必须等待来自多个套接字的数据的服务器毫无用处。

我无法理解句子这对于编写必须等待来自多个套接字的数据的服务器是无用的

在我看来,如果我无法说服客户,我不应该使用主动模式。

但是我可以为每个客户端创建一个具有被动模式的并行服务器(一个客户端的一个Erlng进程)。

也许它说多个套接字的Erlang进程。但我无法想象这个例子的例子。

你能给我更多关于它的信息吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

  

不幸的是,当我们处于被动模式时,我们只能等待来自一个套接字的数据。这对于编写必须等待来自多个套接字的数据的服务器毫无用处。

我说这不是一个反对被动套接字的非常引人注目的论据。几乎在所有情况下,每个插槽都有一个Erlang进程,并且这个问题不会出现。

针对被动套接字的一个更好的论据是,在等待数据时(使用gen_tcp:recv),进程无法从其他Erlang进程接收消息。这些消息可能是计算结果,关闭请求等等。

也就是说,当使用主动或主动一次模式时,receive看起来像这样:

receive
    {tcp, Socket, Data} ->
        %% do something with Data
        %% then reactivate the socket
        ok = inet:setopts(Socket, [{active,once}]),
        loop(Socket);
    {result, Result} ->
        %% send Result back to socket
        ok = gen_tcp:send(Socket, Result),
        loop(Socket);
    stop ->
        %% stop this process
        exit(normal)
end

使用此代码,无论是套接字上的传入数据还是来自另一个Erlang进程的消息,都将首先处理首先到达的事件。

另一方面,如果您使用gen_tcp:recv来接收数据,则会阻止该通话,无法及时对{result, Result}stop做出反应。