我一直在閱讀很多ASIO示例,但我仍然對如何在應用程序中使用它們感到困惑。基本上,我的服務器端需要接受超過100個連接(客戶端),這部分是通過使用一個線程池(通常每個CPU核心有2〜4個線程)完成的。如何將這個Boost ASIO示例應用到我的應用程序
爲簡單起見,我們假設只有一個連接。
爲了簡單起見,我也想的例子從複製:http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/example/nonblocking/third_party_lib.cpp
class session
{
public:
session(tcp::socket&)
bool want_read() const;
bool do_read(boost::system::error_code&);
bool want_write() const;
bool do_write(boost::system::error_code&);
};
class connection : public boost::enable_shared_from_this<connection>
{
public:
typedef boost::shared_ptr<connection> pointer;
static pointer create(boost::asio::io_service&);
tcp::socket& socket();
void start();
private:
connection(boost::asio::io_service&);
void start_operation();
void handle_read(boost::system::error_code);
void handle_write(boost::system::error_code);
}
class server
{
public:
server(boost::asio::io_service&, unsigned short);
private:
void start_accept();
void handle_accept(connection::pointer, const boost::system::error_code&);
}
您可以檢查鏈接的完整的類實現。
我想要做的是爲讀/寫操作加入到session
類(或者我應該直接把他們connection
?)
AsyncRead(buffer, expectedBytesToRead, timeout, handler);
Read(buffer, expectedBytesToRead, timeout);
AsyncWrite(buffer, expectedBytesToWrite, timeout, handler);
Write(buffer, expectedBytesToWrite, timeout);
我看過很多例子,但它在我看來,很難弄清楚如何使用它們,即在我的應用程序中實現上述4種常用方法。
我想我非常接近我想要的東西,我只是沒有從一個非常簡單的例子開始。我讀了@ boost.org的例子,它們要麼太複雜,以至於無法理解我的項目中的邏輯或者我想要的內容。
您鏈接的'null_buffers'示例顯示如何將asio'io_service'事件循環與已經在套接字上執行'read'和'write'的庫集成。我不清楚你有這個要求。你能澄清你爲什麼要使用'null_buffers'? –
是的。我也很困惑。我這樣做的原因是我想將讀/寫邏輯與'connection'類分開。也許,正如我所說的,我應該把上述4個請求的方法放在'connection'類中(刪除無用的'session'類)?另一個原因是,我有一箇舊類(從舊代碼)進行低級讀/寫操作,所以我將它視爲第三方庫。 –
因爲它是你的代碼我建議你用Asio的'async_read()'和'async_write()'自由函數重寫它。使用'null_buffers'的唯一原因是如果你有遺留代碼或者第三方代碼不可能被改變。 –