boost asio

来源:互联网 发布:尼尔机械纪元a卡优化 编辑:程序博客网 时间:2024/05/16 15:13
#include <iostream>#include <memory>#include <boost/asio.hpp>#include <boost/array.hpp>#include <boost/bind.hpp>#include <boost/system/system_error.hpp>using namespace boost::asio::ip;class Session : public std::enable_shared_from_this<Session>{public:Session(boost::asio::io_service &ios) : socket_(ios){}tcp::socket &getSocket(){return socket_;}void startRead(){auto self(shared_from_this());socket_.async_read_some(boost::asio::buffer(buffer_),[this, self](const boost::system::error_code &error,size_t bytes_transferred){if (!error){startWrite(bytes_transferred);}});}void startWrite(size_t bytes_transferred){auto self(shared_from_this());boost::asio::async_write(socket_, boost::asio::buffer(&buffer_[0], bytes_transferred),[this, self](const boost::system::error_code &error, size_t bytes_transferred){if (!error){startRead();}});}private:tcp::socket socket_;enum { kMaxLength = 4096 };boost::array<char, kMaxLength> buffer_{};};class Server{public:Server(boost::asio::io_service &ios, unsigned short port) : io_service_(ios),acceptor_(io_service_, tcp::endpoint(tcp::v4(), port)){startAccept();}void startAccept(){std::shared_ptr<Session> session_ptr = std::make_shared<Session>(io_service_);acceptor_.async_accept(session_ptr->getSocket(),[this, session_ptr](const boost::system::error_code &error){if (!error){session_ptr->startRead();}startAccept();});}private:boost::asio::io_service &io_service_;tcp::acceptor acceptor_;};int main(){try{boost::asio::io_service ios;Server server(ios, 8888);ios.run();}catch (const std::exception& e){std::cerr << "Exception: " << e.what() << "\n";}return 0;}

0 0