免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2858 | 回复: 0
打印 上一主题 下一主题

boost--asio--读写大总结 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-19 16:20 |只看该作者 |倒序浏览
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, "\r\n");
C: boost::asio::read_at 是在读的时候加上一个偏移量( I  thin k  )但是我用在socket的读写上没有成功, 可能用在其他device 上,  好吧,先不用你 。
直接用boost::asio 库全局函数读写有一个好处,就是能够利用
transfer_all
transfer_at_least
俩个函数 ,
示例如下:
boost::array buf;
boost::system::error_code ec;
std::size_t n = boost::asio::read(
    sock, boost::asio::buffer(buf),
    boost::asio::transfer_all(), ec);
if (ec)
{
  // An error occurred.
}
else
{
  // n == 128
}
同理:boost::array 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
}
其实以上就是实现了socket。Read_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 命名空间下:
async_read
async_read_at
async_read_until
boost::asio::async_read( socket_own , boost::asio::buffer ( data_copy ) ,
                                                                  boost::bind( & client::handle_read ,this ,         boost::asio::placeholders::error , boost::asio::placeholders::bytes_transferred );
                                                                );
相对应的socket 的成员函数 异步操作如下:
async_read_some
async_receive
示例如下:
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
如:
   
boost::asio::streambuf request;
    std::ostream request_stream(&request);
    request_stream
    request_stream
    request_stream
    request_stream
    // Send the request.
boost::asio::write(socket, request);
而read_until 同写 操作 , 例子 参照上 。
async_write
同上,
Socket 相应的成员函数
void handler(
                  const boost::system::error_code& error, // Result of operation.
                 std::size_t bytes_transferred           // Number of bytes written.
);
socket.async_write_some(boost::asio::buffer(data, size), handler);
Socket.send 能够实现相同的功能并且能够添加flag 参数。
第三部分
Boost::streambuf 的 操作总结
boost::asio::streambuf request;
    std::ostream request_stream(&request);
    request_stream
    request_stream
    request_stream
    request_stream
    // Send the request.
boost::asio::write(socket, request);
boost::asio::streambuf b;
std::ostream os(&b);
os
// try sending some data in input sequence
size_t n = sock.send(b.data());
b.consume(n); // sent data is removed from input sequence
Reading from a socket directly into a streambuf:
boost::asio::streambuf b;
// reserve 512 bytes in output sequence
boost::asio::streambuf::const_buffers_type bufs = b.prepare(512);
size_t n = sock.receive(bufs);
// received data is "committed" from output sequence to input sequence
b.commit(n);
std::istream is(&b);
std::string s;
is >> s;
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/102778/showart_2032025.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP