查看源代码 ssh_server_channel 行为 (ssh v5.2.5)
-behaviour(ssh_server_channel). (替换 ssh_daemon_channel)
注意
此模块替换 ssh_daemon_channel。
旧模块仍然可用以保持兼容性,但不应在新程序中使用。旧模块除了进行一些错误修正外,将不再维护。
SSH 服务(客户端和服务端)以通道的形式实现,这些通道在 SSH 连接上进行多路复用,并通过 SSH 连接协议进行通信。此模块提供了一个回调 API,用于处理守护进程的通用通道方面,例如流控制和关闭消息。它允许回调函数处理服务(应用程序)特定的部分。此行为还确保通道进程遵循 OTP 进程的原则,使其能够成为 supervisor 树的一部分。这是实现将被添加到 ssh
应用程序 supervisor 树的子系统的通道进程的要求。
注意
当实现客户端子系统处理程序时,请使用 -behaviour(ssh_client_channel) 代替。
概要
回调
处理发送到通道的 SSH 连接协议消息、调用消息或强制消息以外的其他消息。
处理可能需要服务特定关注的 SSH 连接协议消息。有关详细信息,请参阅 ssh_connection:event/0
。
进行必要的初始化,如果初始化成功,则返回初始通道状态。
当通道进程即将终止时,将调用此函数。在调用此函数之前,如果之前没有调用 ssh_connection:close/2 ,则会调用它。此函数执行任何必要的清理。当它返回时,通道进程以 Reason
原因终止。返回值将被忽略。
回调
-callback handle_msg(Msg :: term(), State :: term()) -> {ok, State :: term()} | {stop, ChannelId :: ssh:channel_id(), State :: term()}.
处理发送到通道的 SSH 连接协议消息、调用消息或强制消息以外的其他消息。
此函数应处理可能的 Erlang 'EXIT' 消息,并且所有通道都应处理以下消息。
{ssh_channel_up,
ssh:channel_id/0
,
ssh:connection_ref/0
}
- 这是通道接收到的第一条消息。如果服务端希望在不先接收来自客户端的消息的情况下向客户端发送消息,则此消息特别有用。如果该消息对您的特定场景没有用处,请立即返回{ok, State}
来忽略它。
-callback handle_ssh_msg(ssh_connection:event(), State :: term()) -> {ok, State :: term()} | {stop, ChannelId :: ssh:channel_id(), State :: term()}.
处理可能需要服务特定关注的 SSH 连接协议消息。有关详细信息,请参阅 ssh_connection:event/0
。
以下消息由 ssh_server_channel
行为处理。
{closed,
ssh:channel_id/0
}
- 如果尚未发送关闭消息,则通道行为会向另一端发送关闭消息。然后它以normal
原因终止通道。
-callback init(Args :: term()) -> {ok, State :: term()} | {ok, State :: term(), timeout() | hibernate} | {stop, Reason :: term()} | ignore.
进行必要的初始化,如果初始化成功,则返回初始通道状态。
可以返回的超时值具有与 gen_server
中相同的语义。如果发生超时,则会调用 handle_msg/2
,即 handle_msg(timeout, State)
。
-callback terminate(Reason :: normal | shutdown | {shutdown, term()} | term(), State :: term()) -> term().
当通道进程即将终止时,将调用此函数。在调用此函数之前,如果之前没有调用 ssh_connection:close/2 ,则会调用它。此函数执行任何必要的清理。当它返回时,通道进程以 Reason
原因终止。返回值将被忽略。