2011-06-20 57 views
4

我正在使用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)處被阻止,直到發出新的請求?

回答

3

什麼可能是由於這種 行爲?

此行爲完全依賴於客戶端代碼。如果它連接,但不發送請求,則服務器在接收數據時發生阻塞。

我怎麼能保證它總是在這個 - > blitzAcceptor.accept阻止 (SOC,EC) 直到一個新的請求時?

你不行。但是您的服務器可以啓動一個在接受連接後立即啓動的超時。如果客戶端在該持續時間內沒有發送請求,請關閉套接字。要做到這一點,你應該切換到使用異步方法而不是同步方法。

+0

謝謝。您的解釋「此行爲完全依賴於客戶端代碼,如果它連接,但不發送請求,則服務器在接收數據時發生阻塞。」是正確的。我正在編寫一個Http服務器,並且在瀏覽器僅在發出新請求時纔會建立新連接。在這裏我注意到它確實建立了一個新的連接,而沒有任何請求發送。截至目前,我服務請求並關閉連接。也許正是因爲這個原因,它才使得一個新的連接成爲一種優化。 –

1

請確保你沒有阻止在read(2)調用文件描述符,你是listen(2)'對文件描述符'accept(2)'編輯。我想如果你打印出文件描述符的數字,你很快就會發現你的問題。

相關問題