Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 没有阻塞的libssh2会话清理?_C_Libssh - Fatal编程技术网

C 没有阻塞的libssh2会话清理?

C 没有阻塞的libssh2会话清理?,c,libssh,C,Libssh,我的应用程序使用libssh2通过SSH进行通信,通常运行良好。我遇到的一个问题是,当远程主机意外死亡时——在本例中,远程主机是一个嵌入式设备,可以随时断电,因此这并不少见 当这种情况发生时,我的应用程序检测到远程计算机已停止响应ping,并按如下方式断开SSH连接的本地端: void SSHSession :: CleanupSession() { if (_uploadFileChannel) { libssh2_channel_free(_uploadFileCha

我的应用程序使用libssh2通过SSH进行通信,通常运行良好。我遇到的一个问题是,当远程主机意外死亡时——在本例中,远程主机是一个嵌入式设备,可以随时断电,因此这并不少见

当这种情况发生时,我的应用程序检测到远程计算机已停止响应ping,并按如下方式断开SSH连接的本地端:

void SSHSession :: CleanupSession()
{
   if (_uploadFileChannel)
   {
      libssh2_channel_free(_uploadFileChannel);
      _uploadFileChannel = NULL;
   }

   if (_sendCommandsChannel)
   {
      libssh2_channel_free(_sendCommandsChannel);
      _sendCommandsChannel = NULL;
   }

   if (_session)
   {
      libssh2_session_disconnect(_session, "bye bye");
      libssh2_session_free(_session);
      _session = NULL;
   }
}
非常简单,但问题是libssh2_channel_free()调用可能会阻塞很长一段时间,等待远程端响应“我现在要走了”消息,因为它关闭了电源,所以永远不会这样做。。。但与此同时,我的应用程序被冻结(在清理程序中被阻止),这并不好


有没有办法(除了破解libssh2)来避免这种情况?我只想拆掉本地SSH数据结构,在拆掉过程中不要阻塞。(我想我可以简单地泄漏SSH会话内存,或者将其委托给另一个线程,但这些看起来像是丑陋的黑客行为,而不是合适的解决方案)

我对libssh2没有经验,但是,也许我们可以通过使用
libssh2\u session\u disconnect\u ex
和不同的断开原因来获得libssh2的不同行为:
SSH\u disconnect\u CONNECTION\u LOST

libssh2\u session\u disconnect
相当于使用
libssh2\u session\u disconnect\u ex
,原因是
SSH\u disconnect\u由应用程序执行。如果libssh2知道连接丢失,那么它可能不会尝试与另一方对话


设置为非阻塞模式,通过将回调函数设置为使用libssh2\u session\u callback\u Set和libssh2\u callback\u RECV for cbtype从soket读取数据,控制从套接字读取数据

如果由于错误ENOTCONN(表示远程端已关闭套接字或连接失败)而无法从套接字读取数据,则在回调函数中返回-ENOTCONN