2013-04-08 51 views
2

我有一個服務器類將啓動兩個線程,一個是接受所有傳入連接並將這些套接字放入一個向量中。另一個是掃描這個套接字向量,找出哪一個被讀取爲可讀/寫,然後執行一些操作。Boost中的單線程服務器

所以問題是,在第二個線程(成員函數),我該如何實際掃描這些套接字?

人們建議使用select()的unix套接字,但我決定在任何地方使用boost,所以我正在尋找提升的解決方案。

我已閱讀了boost.org和本網站的一些文檔。人們說io_service是select的抽象。我不明白。我只是綁定函數/對象,然後使用io_service :: post()把它們放入隊列並使用io_service :: run()來執行?


更新,在我的理解,每次實例化包括io_service對象構造一個新的Socket對象,此Socket對象是聯想與io_service對象,因爲我只有一個io_service對象,這些Socket對象當我打電話io_service.run()

但是,問題是,我如何分配handle_function這些插座,我看到人們使用 acceptor.async_accept(插座將被執行,提高::綁定(處理器,&插座))像這樣,但我想使用accept而不是async_accept(),但是accept()函數不能用於將處理函數綁定到此套接字

我該怎麼辦?

class Server 
{ 
    io_service IOService; 

    std::vector<boost::....::socket> SocketVector; 

    listen() 

    { 
    //blockingly accept all incoming connection and bind socket with handler function; 
    } 

    process HandleRequest() 
    { 
    //io_service.run() 
    } 
} 

int main() 
{ 
    Server myServer; 
    boost::thread thread1(&Server::listen, &myServer); 
    boost::thread thread2(&Server::HandleRequest, &myServer); 
} 
+2

這當然不是答案,但看起來你錯了:你已經固定了某些設計(線程,套接字輪詢等),現在你試圖「伸展「這個計劃放到'Boost.Asio'上。最後,你會得到一個糟糕的設計,不符合你選擇的工具。相反,值得仔細閱讀'Asio'手冊和相關資源(http://blog.think-async.com/)並嘗試「異步思考」。這樣你就可以獲得更好的設計來利用Asio的功能。 – 2013-04-08 15:54:34

+0

謝謝伊戈爾,我的設計是我有一個線程偵聽和一個線程從這些插座中選擇並處理它們。原因是客戶需要長時間連接,但只有少數幾個請求會被髮送。所以我不需要一個線程爲每個連接,而是,我只需要一個線程的所有連接,因此我需要掃描這些套接字,並找到哪一個是availbale [io_service.run()] – cynric4sure 2013-04-08 15:56:24

+0

我不知道我的設計是否好還是不好,請建議其他方法 – cynric4sure 2013-04-08 16:00:48

回答

0

你的設計聽起來過於複雜,很可能不會與升壓短耳很好地集成。是的,您可以爲每個套接字使用一個線程,但是當有多個併發連接時,就會使用該線程。

我建議重新考慮你的設計,並圍繞異步操作。包含在asio文檔中的研究the examples標籤中還有大量信息。