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