中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Thrift第四課 連接中斷異常處理

發布時間:2020-06-28 08:49:54 來源:網絡 閱讀:7582 作者:fengyuzaitu 欄目:軟件技術

場景

????????Thrift框架采用了異常處理機制,當客戶端異常斷開連接,服務端這個時候嘗試發送數據給客戶端,Thrift庫會拋出異常,導致進程中斷。這種情況是非常正常的,服務器端應該捕獲異常的發生,但是不應該異常退出。


在用戶調用的線程進行異常捕獲,這樣子不需要修改代碼

catch (const TTransportException& ttx)

{

//Thrift框架拋出的所有異常都會直接返回

std::cout<<ttx.what()<<std::endl;

return;

}

catch (const TException& ttx)

{

//Thrift框架拋出的所有異常都會直接返回

std::cout<<ttx.what()<<std::endl;

return;

}


分析一下服務器發送數據的函數

void TSocket::write(const uint8_t* buf, uint32_t len) {

? uint32_t sent = 0;


? while (sent < len) {

?uint32_t b = write_partial(buf + sent, len - sent);

?if (b == 0) {

?// This should only happen if the timeout set with SO_SNDTIMEO expired.

?// Raise an exception.

?throw TTransportException(TTransportException::TIMED_OUT,

?"send timeout expired");

?}

?sent += b;

? }

}

但b==0拋出異常,代表當前發送超時。while循環是為了循環發送,因為一次不一定發送完用戶數據,畢竟MTU的限制。注意sent是一個無符號整型,當b返回-1的時候,sent==0-1意味著將達到32位整數最大值,大于len,從而直接退出循環。因為套接字已經中斷,所以發送失敗,在調用write_partial函數的時候,返回b ==-1,導致退出循環,從而避免了拋出異常,因此返回-1,是非常合理的值


問題
1)? 客戶端沒有調用close接口,關閉連接,服務器端只有唯一的一次closesocket代碼,輸出的字符串是\x1,目前暫時不知道在什么地方關閉套接字
2)? 線程在空閑的時候是如何進行等待事件請求的
3)? pendingTaskCountMax_ 參數的具體含義是什么
4)isOpen函數其實只是確保了連接是否成功,如果連接成功之后,如果服務器斷開或者客戶端斷開連接,這個時候判斷isOpen函數的返回值是沒有任何的效果的,這個時候只能夠通過thrift自身的斷開連接的檢測機制,目前尚不了解會在什么時機釋放連接


其他的處理細節

1)繼承TServerEventHandler類,獲取連接用戶的基本信息包括IP和端口,從而監控是否保存有沒有清除的連接
TServerEventHandler類提供了用戶連接和斷開的時候,針對套接字的處理方式,其中提供了兩個函數
createContext 當一個新的用戶連接的時候會被調用
deleteContext 當用戶結束請求處理的時候會被調用
?
詳細的流程可以查看TThreadPoolServer::Task,Task作為TThreadPoolServer的內部類,在Task::run函數內部,當有連接進來的時候,會獲取TServerEventHandler類的對象,判斷是否有實例化,對連接進行處理,詳細的代碼??
boost::shared_ptr<TServerEventHandler>eventHandler =
?server_.getEventHandler();
??
void* connectionContext = NULL;
if (eventHandler != NULL)
{????
?connectionContext =eventHandler->createContext(input_, output_);
}
?

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

定结县| 嘉善县| 武清区| 通化县| 咸宁市| 双辽市| 晋城| 晋州市| 松阳县| 广平县| 武山县| 获嘉县| 嘉定区| 榕江县| 醴陵市| 桐柏县| 阿巴嘎旗| 双峰县| 林芝县| 安吉县| 水城县| 银川市| 苗栗市| 元朗区| 福海县| 崇文区| 曲松县| 宝兴县| 汉川市| 孝感市| 东辽县| 屏东县| 兴义市| 德清县| 柞水县| 兴业县| 肃宁县| 昭平县| 新宾| 巢湖市| 措勤县|