簡體   English   中英

在沒有新連接的情況下,增強asio-acceptor解鎖?

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

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