gpt4 book ai didi

sockets - erlang:到controlling_process(),或者不到controlling_process()

转载 作者:行者123 更新时间:2023-12-02 01:51:03 28 4
gpt4 key购买 nike

考虑以下简单回显服务器的 erlang 代码:

回声监听器:

-module(echo_listener).
-export([start_link/1]).

-define(TCP_OPTIONS, [binary, {packet, 0}, {reuseaddr, true},
{keepalive, true}, {backlog, 30}, {active, false}]).

start_link(ListenPort) ->
{ok, ListenSocket} = gen_tcp:listen(ListenPort, ?TCP_OPTIONS),
accept_loop(ListenSocket).

accept_loop(ListenSocket) ->
{ok, ClientSocket} = gen_tcp:accept(ListenSocket),
Pid = spawn(echo_worker, usher, [ClientSocket]),
gen_tcp:controlling_process(ClientSocket, Pid),
accept_loop(ListenSocket).

回声 worker :
-module(echo_worker).
-export([echo/1]).

echo(ClientSocket) ->
case gen_tcp:recv(ClientSocket, 0) of
{ok, Data} ->
gen_tcp:send(ClientSocket, Data),
echo(ClientSocket);
{error, closed} ->
ok
end.

每当接受客户端套接字时,回显服务器会生成一个回显工作程序并将客户端套接字直接作为函数参数传递。在代码中有controller_process(),但我已经尝试了没有调用controlling_process() 的代码,它也可以工作。

control_process() 的真正目的是什么?什么时候需要?

提前致谢。

最佳答案

Erlang 文档说明了 gen_tcp:controlling_process/1:

Assigns a new controlling process Pid to Socket. The controlling process is the process which receives messages from the socket. If called by any other process than the current controlling process, {error, not_owner} is returned.



您使用选项 {active, false} 创建了监听套接字,并使用 gen_tcp:recv/2 同步读取套接字,因此即使不调用 gen_tcp:controlling_process/1,您的代码也能正常工作。但是,如果您想异步接收数据,则必须使用选项 {active, true} 创建监听套接字。在这种情况下,已接受连接的所有者将收到有关传入数据的消息。因此,如果您不调用 gen_tcp:controlling_process/1 这些消息将被发送到监听器进程而不是工作进程。

关于sockets - erlang:到controlling_process(),或者不到controlling_process(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22650774/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com