zoukankan      html  css  js  c++  java
  • Boost.Asio c++ 网络编程翻译(26)

    Boost.Asio-其他特性
    这章我们讲了解一些Boost.Asio不那么为人所知的特性。标准的stream和streambuf对象有时候会更难用一些,但正如你所见。它们也有它们的益处。最后,你会看到姗姗来迟的Boost.Asio协程的入口,它能够让你的异步代码变的很易读。这是很惊人的一个特性。


    标准stream和标准I/O buffer
    读这一章节之前你须要对STL stream和STL streambuf对象有所了解。
    Boost.Asio在处理I/O操作时支持两种类型的buffer:
    • boost::asio::buffer():这样的buffer关联着一个Boost.Asio的操作(我们使用的buffer被传递给一个Boost.Asio的操作)
    • boost::asio::streambuf:这个buffer继承自std::streambuf,在网络编程中能够喝STL stream一起使用
    纵观全书。之前的样例中最常见的样例例如以下:
    1. size_t read_complete(boost::system::error_code, size_t bytes){ ... }
         char buff[1024];
         read(sock, buffer(buff), read_complete);
         write(sock, buffer("echo
      "));
      
    通常来说使用这个就能满足你的须要,假设你想要更复杂。你能够使用streambuf来实现。
    这个就是你能够用streambuf对象做的最简单也是最坏的事情:

    streambuf buf;

       read(sock, buf);
    
    这个会一直读到streambuf对象满了。然后由于streambuf对象能够通过自己又一次开辟空间从而获取很多其它的空间,它基本会读到连接被关闭。
    你能够使用read_until一直读到一个特定的字符串:

    streambuf buf;

    read_until(sock, buf, " ");

    这个样例会一直读到一个“ ”为止,把它加入到buffer的末尾,然后退出read方法。
    向一个streambuf对象写一些东西,你须要做一些类似以下的事情:

    streambuf buf;
       std::ostream out(&buf);
       out << "echo" << std::endl;
       write(sock, buf);
    
    这是很直观的;你在构造函数中传递你的streambuf对象来构建一个STL stream,将其写入到你想要发送的消息中,然后使用write来发送buffer的内容。

    Boost.Asio和STL stream
    Boost.Asio在集成STL stream和网络方面做了非常棒的工作。也就是说。假设你已经在使用STL扩展,你肯定就已经拥有了大量重载了操作符<<和>>的类。从socket读或者写入它们就好像在公园漫步一样简单。

    如果你有以下的代码片段:
    struct person {
           std::string first_name, last_name;
           int age;
    
       };
       std::ostream& operator<<(std::ostream & out, const person & p) {
    
           return out << p.first_name << " " << p.last_name << " " << p.age;
       }
    std::istream& operator>>(std::istream & in, person & p) {
    
        return in >> p.first_name >> p.last_name >> p.age;
    

    通过网络发送这个person就像以下的代码片段这么简单:
    streambuf buf;
       std::ostream out(&buf);
       person p;
       // … 初始化p
       out << p << std::endl;
       write(sock, buf);
    
    另外一个部分也能够很easy的读取:
    read_until(sock, buf, "
    ");
       std::istream in(&buf);
       person p;
       in >> p;
    
    使用streambuf对象,当然,也包含它用来写入的std::ostream和用来读取的std::istream时最优秀的部分就是你终于的编码会非常自然:
    • 当通过网络写入一些要发送的东西时。非常有可能你会有多个片段的数据。所以,你须要把数据加入到一个buffer里面。假设那个数据不是一个字符串,你须要先把它转换成一个字符串。

      当使用<<操作符时这些操作默认都已经做了

    • 相同。在另外一个部分,当读取一个消息时,你须要解析它,也就是说。读取到一个片段的数据时,假设这个数据不是字符串,你须要将它转换为字符串。当你使用>>操作符读取一些东西时这些也是默认就做了的
    最后要给出的是一个很著名,很酷的诀窍。使用以下的代码片段把streambuf的内容输出到console中
    1. streambuf buf;
         ...
         std::cout << &buf << std::endl; // 把全部内容输出到console中
      
    相同的,使用以下的代码片段来把它的内容转换为一个string:
    1. std::string to_string(streambuf &buf) {
             std::ostringstream out;
             out << &buf;
             return out.str();
      


  • 相关阅读:
    随机读取记录
    js 抓取Google词库内容(仅供学习)
    分组统查询
    计时执行后台方法2
    js 调用WinForm角本
    vs2005 确保已安装文件类型(*.*)错误
    原创:SQL Server 数据库附加分离类
    Ajax Js倒计时执行后台方法
    空间前方交会和空间后方交会的区别
    cesium支持的3d模型格式
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4878046.html
Copyright © 2011-2022 走看看