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

Sockets 在哪种情况下,我们应该在Erlang中使用混合方法套接字?,sockets,erlang,Sockets,Erlang,如第17.2章所述 Erlang套接字可以以三种模式之一打开:主动、一次主动或被动 您可能认为对所有服务器使用被动模式是正确的方法。不幸的是,当我们处于被动模式时,我们只能等待来自一个套接字的数据。这对于编写必须等待来自多个套接字的数据的服务器是无用的 我只是无法理解这句话这对于编写必须等待来自多个套接字的数据的服务器是无用的 在我看来,如果我不能说服客户,我就不应该使用主动模式 但是我可以为每个客户机创建一个具有被动模式的并行服务器(一个客户机一个Erlng进程) 也许它说的是一个用于多个套

如第17.2章所述

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

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

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

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

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

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

你能给我更多的信息吗

谢谢大家!

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

我想说,这不是一个非常有说服力的反对被动套接字的论点。在几乎所有情况下,每个套接字都有一个Erlang进程,而这个问题不会出现

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

也就是说,当使用active(活动)或active once(活动一次)模式时,您的
接收将如下所示:

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}
停止
做出反应。

还要注意,该书已过时,因为有四种模式:主动、主动N、主动一次和被动。