我正在使用C++ boost asio庫,我在這裏偵聽套接字上的新連接。在獲得連接時,我處理請求,然後在循環中偵聽另一個套接字上的新連接。提升asio-acceptor在沒有新連接的情況下取消阻止?
while (true)
{
tcp::socket soc(this->blitzIOService);
this->blitzAcceptor.listen();
boost::system::error_code ec;
this->blitzAcceptor.accept(soc,ec);
if (ec)
{
// Some error occured
cerr << "Error Value: " << ec.value() << endl;
cerr << "Error Message: " << ec.message() << endl;
soc.close();
break;
}
else
{
this->HandleRequest(soc);
soc.shutdown(tcp::socket::shutdown_both);
soc.close();
}
}
按照我的理解,應該總是在這個 - > blitzAcceptor.accept(SOC,EC)塊;並且每次建立新連接時,都應該在this-> HandleRequest(soc)中處理它。並再次阻止在this-> blitzAcceptor.accept(soc,ec);
但我看到的是這是首次將在阻止這個 - > blitzAcceptor.accept(SOC,EC),當一個新的連接時,將處理該請求,而是阻塞再次在this-> blitzAcceptor.accept(soc,ec)它將繼續進入this-> HandleRequest(soc); and block at soc.receive();裏面。
這並不總是發生,而是發生在大部分時間。這種行爲可能是什麼原因造成的,我怎樣才能確保它始終在這個 - > blitzAcceptor.accept(soc,ec)處被阻止,直到發出新的請求?
謝謝。您的解釋「此行爲完全依賴於客戶端代碼,如果它連接,但不發送請求,則服務器在接收數據時發生阻塞。」是正確的。我正在編寫一個Http服務器,並且在瀏覽器僅在發出新請求時纔會建立新連接。在這裏我注意到它確實建立了一個新的連接,而沒有任何請求發送。截至目前,我服務請求並關閉連接。也許正是因爲這個原因,它才使得一個新的連接成爲一種優化。 –