zoukankan      html  css  js  c++  java
  • boost--asio--读写大总结

    NO.1

    ASIO 读操作大总结:

    A. Boos::asio::read 同步读方式

    void client::read_data(char   * sourse  , int num )

    {

      boost::asio::read( socket_own , boost::asio::buffer( sourse , num ) );

    }

      Buffer 可以换成 boost::streambuf 

    如:

        boost::asio::streambuf response ;

    boost::asio::read (socket, response );

    而 streambuf 是能过自动扩充的 。

     

    B. boost::asio::read_until 同步方式读, 但是读到特定的字符串后结束

    例子;

        boost::asio::streambuf response;

        boost::asio::read_until(socket, response, " ");

     

    C: boost::asio::read_at 是在读的时候加上一个偏移量( I  thin k  )但是我用在socket的读写上没有成功, 可能用在其他device 上,  好吧,先不用你 。

     俩个函数 ,

    示例如下:

    boost::array<char,

        boost::asio::transfer_all(), ec);

    if (ec)

    {

      // An error occurred.

    }

    else

    {

      // n == 128

    }

     

    同理:boost::array<char, 128> buf;

    boost::system::error_code ec;

    std::size_t n = boost::asio::read(

        sock, boost::asio::buffer(buf),

        boost::asio::transfer_at_least(64), ec);

    if (ec)

    {

      // An error occurred.

    }

    else

    {

      // n >= 64 && n <= 128

    }

    其实以上就是实现了socketRead_some 的作用 。

     

    ---------------------------------------------------------------------------------

    D.重量出击 socke 成员函数 读操作

    Socket. Receive ( boost::asio::buffer( buff ) );

    利用receive的好处之一就是它既可以代替read 函数,同时还可以在后边加一个flag 参数 , 设置socket 的属性。

     

    E: 更好使的是 socket.read_some ( boost::asio::buffer( buff ) ) ;

     这个函数的神奇之处在于, 你在buffer中设置了比较大的缓冲区,这没有问题 , 它并不一定会把缓冲区填满才完成,而是读到eof 即完成操作,这样我们可以不必在关心server到底会发多少size_t client,我们 只管设置一个较大缓冲区, read_some 就知道读多少。它返回 std::size_t.

    F: 以上介绍的都是同步方式操作的,下面是相对应的异步读操作。

    如下是 boost::asio 命名空间下:


      boost::bind( & client::handle_read ,this ,  boost::asio::placeholders::error , boost::asio::placeholders::bytes_transferred );
    boost::asio::async_read( socket_own , boost::asio::buffer ( data_copy ) , 

    );

    相对应的socket 的成员函数 异步操作如下:


    void handler(
    示例如下:

       const boost::system::error_code& error, // Result of operation.

       std::size_t bytes_transferred           // Number of bytes read.

    );

    socket.async_read_some(boost::asio::buffer(data, size), handler);

    很好的是, async_read_some 能够知道读多少数据, 所以我们的size可以尽可能的大一点,而 receive 的话可以保证读固定大小数据。

     

    ---------------------------------------------------------------------------------------

    第二部分 写

    ASIO 读操作大总结:

    A. Boos::asio::write 同步写方式

    void client::write_data(char   * sourse  , int num )

    {

     

    boost::asio::write( socket_own , boost::asio::buffer( sourse , num ) );

    }

      Buffer 可以换成 boost::streambuf 

  • 相关阅读:
    glBlendFunc的几种常用情况
    android发布版本的几个命令
    android拾遗——Android 动画学习笔记
    android拾遗——四大基本组件介绍与生命周期
    C++拾遗——重新开始
    mark Java NIO
    转 mysql中int、bigint、smallint 和 tinyint的区别与长度的含义
    mysql到redis的复制
    MySQL UDF(自定义函数)
    windows下redis 和 hiredis的编译与使用
  • 原文地址:https://www.cnblogs.com/liaocheng/p/4420902.html
Copyright © 2011-2022 走看看