2014-10-11 70 views
1

我想學習ASIO的提升,但我很難理解它。我想爲應該可擴展和高性能的服務器製作基本佈局。處理async_accept時不接受?

在下面的網址則存在一個小的TCP服務器設置一個例子: http://www.boost.org/doc/libs/1_42_0/doc/html/boost_asio/tutorial/tutdaytime3/src.html

我不明白的是以下部分:

void start_accept() 
{ 
tcp_connection::pointer new_connection = 
    tcp_connection::create(acceptor_.io_service()); 

acceptor_.async_accept(new_connection->socket(), 
    boost::bind(&tcp_server::handle_accept, this, new_connection, 
     boost::asio::placeholders::error)); 
} 

void handle_accept(tcp_connection::pointer new_connection, 
    const boost::system::error_code& error) 
{ 
    if (!error) 
    { 
    new_connection->start(); 
    start_accept(); 
    } 
} 

start_accept()最終調用async_accept ()在接收數據時調用它的處理函數。 處理程序在完成時調用start_accept()。

但是,如果客戶端在處理程序仍在運行時嘗試連接,會發生什麼情況?是不是因爲async_accept()不再被監聽而無法處理請求?

如果我以錯誤的視角看待事情,我希望你能指引我正確的方向。

+1

[This](http://stackoverflow.com/a/15883510/1053968)答案試圖強調狀態和操作之間的區別,這在學習Boost.Asio時可能會有所幫助。 – 2014-10-11 17:33:28

回答

2

我想你注意到處理器發佈一個新async_accept操作處理接受(new_connection->start())後:

void handle_accept(tcp_connection::pointer new_connection, 
    const boost::system::error_code& error) 
{ 
    if (!error) 
    { 
    new_connection->start(); // this posts connection specific asynch operations 
    start_accept();   // THIS POSTS THE ASYNC OPERATION AGAIN 
    } 
} 

你問是否有競爭條件有(其中新的異步接受未掛起在內核收到連接的確切時刻)。

沒有這樣的競爭,因爲內核在TCP/IP堆棧實現中排隊事件。


由於事實上,看看傳統的select/poll/epoll方法,同樣,當套接字狀態發生改變,你沒有得到一個異步信號。相反,您可以在自己的閒暇時間進行投票。

內核對待處理事件的時間,緩衝區大小和數量有一些限制,所以如果在某段時間內未能處理事件,它們可能會消失。

只要用戶級代碼不能直接控制原始硬件,那裏就不會有競爭條件,因爲OS棧必須將中斷請求提取出來(否則你會調用該OS一個ExoKernel)。

+0

我有點明白你的意思!但我想你可能會誤解我的問題(mayby,那是我的錯誤)。在start_accept()之前執行new_connection-> start()並不是真的,但更像是:只有在調用async_accept時才能接受連接。但async_accept只接受1連接權?因此,當處理程序運行時(即使new_connection-> start()是異步的,仍然有一點延遲嗎?),直到它完成並且start_accept()再次調用並再次到達async_accept()時才能接受連接。 – 2014-10-11 15:07:58

+0

等待!我再次閱讀你的答案,我完全明白你的意思。因此,操作系統會將網絡消息保留一段時間,最終當它們不從隊列中取出時,它們將被刪除。這是正確的嗎?所以,只要處理程序不會花費太長時間,那麼小延遲並不重要。 (因此,我們可能需要處理線程的大反應嗎?)作爲最後一個問題!:你是否知道例如Windows和Linux平均可以存儲多長時間?這是一個幾秒或幾毫秒的問題? – 2014-10-11 15:14:05

+0

@ChristianVeenman是的,所有代碼最終在任何CPU上「順序」運行。無論如何,沒有兩件事發生在同一時間,但沒關係。無論如何,硬件無法同時到達兩個數據包。有很多層緩衝來使其工作。你想要的是最小延遲。這是你得到的。 – sehe 2014-10-11 15:14:23