1. 程式人生 > >boost- asio 測試

boost- asio 測試

asio_001.cpp

// 一個簡單的回顯伺服器

#include <iostream>
#include <memory>
#include <array>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

// 伺服器和某個客戶端之間的“會話”
// 負責處理讀寫事件
class session : public std::enable_shared_from_this<session>
{
public:
    session(tcp::socket s) : socket_(std
::move(s)) {} void start() { async_read(); } private: void async_read() { auto self(shared_from_this()); socket_.async_read_some(boost::asio::buffer(data_), // 非同步讀 [this, self](const boost::system::error_code &ec, size_t bytes_transferred) // 讀操作完成時回撥該函式
{ // 捕獲`self`使shared_ptr<session>的引用計數增加1,在該例中避免了async_read()退出時其引用計數變為0 if (!ec) async_write(bytes_transferred); // 讀完即寫 } ); } void async_write(std::size_t length) { auto self(shared_from_this()); boost::asio::async_write(socket_, boost::asio::buffer(data_, length), // 非同步寫
[this, self](const boost::system::error_code &ec, size_t) { if (!ec) async_read(); } ); } tcp::socket socket_; // “會話”基於已經建立的socket連線 std::array<char, 1024> data_; }; // 伺服器類 // 監聽客戶端連線請求(async_accept)。與某個客戶端建立socket連線後,為它建立一個session class server { public: server(boost::asio::io_service &io_service, short port) : acceptor_(io_service, tcp::endpoint(tcp::v4(), port)), socket_(io_service) { async_accept(); } private: void async_accept() { acceptor_.async_accept(socket_, std::bind(&server::handle_accept, this, std::placeholders::_1)); // 非同步accept。socket連線建立後,呼叫handle_accept() } void handle_accept(const boost::system::error_code &ec) { if (!ec) { std::shared_ptr<session> session_ptr(new session(std::move(socket_))); session_ptr->start(); } async_accept(); // 繼續監聽客戶端連線請求 } tcp::acceptor acceptor_; tcp::socket socket_; }; int main(int argc, char* argv[]) { boost::asio::io_service io_service; server s(io_service, 52014); io_service.run(); return 0; }

2 ,編譯
g++ asio_001.cpp -o asio_001 -std=c++11 -I /usr/local/boost/include -L /usr/local/boost/lib -lboost_system -lboost_thread -lpthread
3,執行
./asio_001

用網路助手測試如下:
這裡寫圖片描述
程式碼是借鑑的。