[英]libssh2 session cleanup without blocking?
我的應用程序使用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_session_disconnect_ex
和不同的斷開連接原因從libssh2中獲得不同的行為: SSH_DISCONNECT_CONNECTION_LOST
。
libssh2_session_disconnect
等效於使用libssh2_session_disconnect_ex
,其原因為SSH_DISCONNECT_BY_APPLICATION
。 如果libssh2知道連接已丟失,則可能不會嘗試與另一端通信。
http://libssh2.sourceforge.net/doc/#libssh2sessiondisconnectex
設置為非阻塞模式,並通過將回調函數設置為使用libssh2_session_callback_set和cbtype的LIBSSH2_CALLBACK_RECV來從套接字讀取數據,從而控制從套接字讀取數據到您的手
void * libssh2_session_callback_set(LIBSSH2_SESSION * session,int cbtype,void * callback);
如果由於錯誤ENOTCONN而無法從套接字讀取數據,這意味着遠程端已關閉套接字或連接失敗,則在回調函數中返回-ENOTCONN
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.