gpt4 book ai didi

c++ - libssh2:写入数据包:套接字错误(或连接关闭)

转载 作者:行者123 更新时间:2023-11-30 17:28:38 25 4
gpt4 key购买 nike

我按照 link 上找到的教程进行操作。一切正常,我可以在远程主机上执行命令。但是,当我尝试在与 Zhone MXK 198(它是网络设备)的 session 上调用 ssh_channel_request_exec() 函数时,出现以下错误:

Writing packet: error on socket (or connection closed): Operation now in progress.

但是我可以手动连接到该设备(通过使用 openssh)。我认为这个错误与以下事实有关:MXK 上的 CLI 与 Linux 上已知的常见 CLI 略有不同。例如,退格键被解释为删除,因此键映射出现问题。我假设我需要更改发送到套接字的数据格式。或者也许我错了?你能给我一些想法吗?

最佳答案

我认为您还没有将键码视为问题。从您给出的消息来看,我怀疑您调用了异步函数,但将其视为同步,出错而不是等待。

假设我们有以下代码片段:

n = recv(socket, buffer, sizeof buffer, 0);
if (n == -1) {
err(1, "Error receiving data from socket");
}
<work with the n bytes received on buffer>

在大多数情况下,这对于同步套接字来说是完全没问题的,但如果它是异步操作(您在标志上传递了 MSG_DONTWAIT,或使用 fcntl/setsockopt 设置 O_NONBLOCK),您应该期望它使用 EAGAIN 返回 -1 作为错误号。

1 在真实的应用程序中,您还应该处理 EINTR(例如,进程收到 signal )。

在这种情况下,您将收到 EINPROGRESS,从中我们可以得知未完成的“失败”函数是 connect()。请参阅what are possible reason for socket error einprogress?

connect(2)手册页对此错误也非常明确:

EINPROGRESS
The socket is nonblocking and the connection cannot be completed immediately.
It is possible to select(2) or poll(2) for completion by selecting the
socket for writing. After select(2) indicates writability, use getsockopt(2)
to read the SO_ERROR option at level SOL_SOCKET to determine whether connect()
completed successfully (SO_ERROR is zero) or unsuccessfully (SO_ERROR is
one of the usual error codes listed here, explaining the reason for the failure).

您可以使用 ssh_set_blocking() 将 libssh 更改为阻止或在套接字上使用 ssh_get_poll_flags() 选择/轮询标志。

关于c++ - libssh2:写入数据包:套接字错误(或连接关闭),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25996227/

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