[英]Boost asio-acceptor unblocks without a new connection?
我正在使用C ++ boost asio庫,我在其中監聽套接字上的新連接。 在獲取連接時,我處理請求,然后在循環中的另一個套接字上偵聽新連接。
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)中處理它; 並再次阻止此 - > blitzAcceptor.accept(soc,ec);
但我所看到的是,它首次會阻止此 - > blitzAcceptor.accept(soc,ec),並且當建立新連接時它將處理請求,而不是再次阻止此 - > blitzAcceptor。接受(soc,ec)它會繼續進入這個 - > HandleRequest(soc); 並阻止在soc.receive(); 內。
這不會一直發生,但大部分時間都會發生。 可能是這種行為的原因,我怎樣才能確保它始終阻止此 - > blitzAcceptor.accept(soc,ec)直到發出新請求?
這種行為可能是什么原因?
此行為完全取決於客戶端代碼。 如果它連接,但不發送請求,則服務器在接收數據時使用塊。
我怎樣才能確保它始終阻止此 - > blitzAcceptor.accept(soc,ec)直到發出新請求?
你不能。 但是,您的服務器可以啟動在接受連接后立即啟動的超時。 如果客戶端未在該持續時間內發送請求,請關閉套接字。 為此,您應該切換到使用異步方法而不是同步方法。
確保你沒有阻止read(2)
調用你正在listen(2)
文件描述符listen(2)
和你accept(2)
文件描述符accept(2)
'ed。 我想如果你打印出文件描述符編號,你很快就會發現問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.