簡體   English   中英

libssh2會話清理沒有阻塞?

[英]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

http://libssh2.sourceforge.net/doc/#sshdisconnectcodes

設置為非阻塞模式,並通過將回調函數設置為使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM