zoukankan      html  css  js  c++  java
  • boost库asio详解8——几个TCP的简单例子

    摘于boost官网的几个例子, 做了点小修改, 笔记之.

    同步客户端

    [cpp] view plain copy
     
     print?
    1. void test_asio_synclient()  
    2. {  
    3.     typedef boost::asio::io_service IoService;  
    4.     // 该命名空间下有几个常用类: accetpt, resolver, endpoint, socket  
    5.     typedef boost::asio::ip::tcp TCP;  
    6.   
    7.     try  
    8.     {  
    9.         IoService ios;  
    10.         boost::system::error_code error;  
    11.   
    12.         // 1. 用解释器的方法, 常用来解析域名, 如  
    13.         // query("www.163.com","80"), 也可以 query("www.163.com","telnet")  
    14.         // echo          7/tcp  
    15.         // ftp           21/tcp                 # File Transfer Protocol (Control)  
    16.         // telnet        23/tcp                 # Virtual Terminal Protocol  
    17.         // smtp          25/tcp                 # Simple Mail Transfer Protocol  
    18.         // time          37/tcp  timeserver     # Time  
    19. //      TCP::resolver resolver(ios);  
    20. //      TCP::resolver::query query("127.0.0.1", "10000");  
    21. //      TCP::resolver::iterator endpoint_iterator = resolver.resolve(query);  
    22. //      TCP::resolver::iterator end;  
    23. //      TCP::socket socket(ios);  
    24. //      socket.connect(*endpoint_iterator, error);  
    25.   
    26.         // 2. 用简便的方法  
    27.         TCP::socket socket(ios);  
    28.         TCP::endpoint endpoint(boost::asio::ip::address_v4::from_string("127.0.0.1"), 10000);  
    29.         socket.connect(endpoint, error);  
    30.   
    31.         // 这里要判断一下, 否则没有连上会通过.  
    32.         if (error)  
    33.             throw boost::system::system_error(error);  
    34.       
    35.         while(true)  
    36.         {  
    37.             // boost::array<char, 128> buf;  
    38.             std::vector<char> buf(128);  
    39.             size_t len = socket.read_some(boost::asio::buffer(buf), error);  
    40.   
    41.             // 这是也要判断一下, 否则服务端运行断开, 这里会出现死循环.  
    42.             if (error == boost::asio::error::eof)  
    43.                 break; // Connection closed cleanly by peer.  
    44.             else if (error)  
    45.                 throw boost::system::system_error(error); // Some other error.  
    46.               
    47.             // buf要注意控制大小。  
    48.             socket.write_some(boost::asio::buffer(buf, len), error);  
    49.         }  
    50.     }  
    51.     catch (std::exception& e)  
    52.     {  
    53.         PRINT_DEBUG(e.what());  
    54.     }  
    55. }  

    同步服务端

    [cpp] view plain copy
     
     print?
    1. namespace  
    2. {  
    3.     std::string make_daytime_string()  
    4.     {  
    5.         using namespace std; // For time_t, time and ctime;  
    6.         time_t now = time(0);  
    7.         return ctime(&now);  
    8.     }  
    9. }  
    10.   
    11. void test_asio_synserver()  
    12. {  
    13.     typedef boost::asio::io_service IoService;  
    14.     typedef boost::asio::ip::tcp TCP;  
    15.   
    16.     try  
    17.     {  
    18.         IoService ios;  
    19.         /* 
    20.             *以下构造函数相当于以下步骤 
    21.             * basic_socket_acceptor<tcp> acceptor(io_service); 
    22.             * acceptor.open(tcp::v4()); 
    23.             * acceptor.bind(tcp::endpoint(13)); 
    24.             * acceptor.listen(0);//default  
    25.         */  
    26.         /* 
    27.             tcp::endpoint(端点)由以下三个部分组成 
    28.             1. IP地址(address, address_v4, address_v6) 
    29.             2. 端口号 
    30.             3. 协议版本 
    31.         */  
    32.         TCP::acceptor acceptor(ios, TCP::endpoint(TCP::v4(), 13));  
    33.         for (;;)  
    34.         {  
    35.             TCP::socket socket(ios);  
    36.             acceptor.accept(socket);  
    37.             std::string message = make_daytime_string();  
    38.   
    39.             boost::system::error_code ignored_error;  
    40.             boost::asio::write(socket,  
    41.                                boost::asio::buffer(message),   
    42.                                boost::asio::transfer_all(),   
    43.                                ignored_error);  
    44.             PRINT_DEBUG(message);  
    45.         }  
    46.     }  
    47.     catch (std::exception& e)  
    48.     {  
    49.         std::cout << e.what() << std::endl;  
    50.     }  
    51. }  

    异步服务端

    [cpp] view plain copy
     
     print?
    1. namespace  
    2. {  
    3.     typedef boost::asio::io_service IoService;  
    4.     typedef boost::asio::ip::tcp TCP;  
    5.   
    6.     std::string make_daytime_string()  
    7.     {  
    8.         using namespace std;  
    9.         time_t now = std::time(NULL);  
    10.         return ctime(&now);  
    11.     }  
    12.   
    13.     class tcp_connection  
    14.         : public boost::enable_shared_from_this<tcp_connection>  
    15.     {  
    16.     public:  
    17.         typedef boost::shared_ptr<tcp_connection> pointer;  
    18.   
    19.         static pointer create(IoService& io_service)  
    20.         {  
    21.             return pointer(new tcp_connection(io_service));  
    22.         }  
    23.   
    24.         TCP::socket& socket()  
    25.         {  
    26.             return socket_;  
    27.         }  
    28.   
    29.         void start()  
    30.         {  
    31.             message_ = make_daytime_string();  
    32.   
    33.             boost::asio::async_write(  
    34.                 socket_,   
    35.                 boost::asio::buffer(message_),   
    36.                 boost::bind(&tcp_connection::handle_write,   
    37.                             shared_from_this(),   
    38.                             boost::asio::placeholders::error,   
    39.                             boost::asio::placeholders::bytes_transferred));  
    40.         }  
    41.     private:  
    42.         tcp_connection(IoService& io_service)  
    43.             : socket_(io_service)  
    44.         {  
    45.         }  
    46.   
    47.         void handle_write(const boost::system::error_code& /*error*/,  
    48.             size_t /*bytes_transferred*/)  
    49.         {  
    50.             PRINT_DEBUG("write data!!!");  
    51.         }  
    52.   
    53.         TCP::socket socket_;  
    54.         std::string message_;  
    55.     };  
    56.   
    57.     class tcp_server  
    58.     {  
    59.     public:  
    60.         tcp_server(IoService& io_service)  
    61.             : acceptor_(io_service, TCP::endpoint(TCP::v4(), 10000))  
    62.         {  
    63.             start_accept();  
    64.         }  
    65.     private:  
    66.         void start_accept()  
    67.         {  
    68.             tcp_connection::pointer new_connection =  
    69.                 tcp_connection::create(acceptor_.get_io_service());  
    70.               
    71.             acceptor_.async_accept(  
    72.                 new_connection->socket(),   
    73.                 boost::bind(&tcp_server::handle_accept,   
    74.                             this,   
    75.                             new_connection,   
    76.                             boost::asio::placeholders::error));  
    77.         }  
    78.   
    79.         void handle_accept(tcp_connection::pointer new_connection,  
    80.             const boost::system::error_code& error)  
    81.         {  
    82.             if (!error)  
    83.             {  
    84.                 new_connection->start();  
    85.                 start_accept();  
    86.             }  
    87.         }  
    88.   
    89.         TCP::acceptor acceptor_;  
    90.     };  
    91. }  
    92.   
    93. // tcp_connection与tcp_server封装后  
    94. void test_asio_asynserver()  
    95. {  
    96.     try  
    97.     {  
    98.         IoService io_service;  
    99.         tcp_server server(io_service);  
    100.   
    101.         // 只有io_service类的run()方法运行之后回调对象才会被调用  
    102.         io_service.run();  
    103.     }  
    104.     catch (std::exception& e)  
    105.     {  
    106.         std::cerr << e.what() << std::endl;  
    107.     }  
    108. }  
     
    http://blog.csdn.net/huang_xw/article/details/8518740
  • 相关阅读:
    算法-heapq模块优先队列
    用find命令删除某目录下及所有子目录中某类型的特定文件
    OpenStack虚拟机virtaulinterfance 网络设备在libvirt的代码梳理
    cinderclient命令行源码解析
    python 多个装饰器的调用顺序分析
    wsgi的environ变量
    Cirros镜像
    写入多个变量到配置文件【linux】
    SecureCRT 私钥登录ec2 报:A protocol error occurred.Too many authentication failures for ec2-user 解决
    S3上备份的json文件转存成parquet文件
  • 原文地址:https://www.cnblogs.com/findumars/p/7257505.html
Copyright © 2011-2022 走看看