zoukankan      html  css  js  c++  java
  • socket通信框架——boost asio

    boost asio是一个封装了基本socket的跨平台通信框架。它支持异步访问,并支持tcp的自动封闭控制等操作。

    一个简单的通信协议可以为:

    header body
    body长 数据

    通过boost::asio接收的话,即可为:

    void receive_header()
    {
      auto keep_alive(shared_from_this());
      auto asbuf = boost::asio::buffer(msg->header(), msg->header_length());
      auto on_header_received = [this, keep_alive]
        (boost::system::error_code ec, std::size_t length)
      {
        if (!ec && buffer->decode_header())
        {
          receive_body();
        }
      };
    
      boost::asio::async_read(socket_id, asbuf, on_header_received);
    }
    
    void receive_body()
    {
      auto keep_alive(shared_from_this());
      auto asbuf = boost::asio::buffer(msg->body(), msg->body_length());
      auto on_body_received = [this, keep_alive]
        (boost::system::error_code ec, std::size_t length)
      {
        if (!ecode && msg->body_length())
        {
          // do something
        }
        receive_header();
      }
    
      boost::asio::async_read(socket_id, asbuf, on_body_received);
    }

    而一个简单的发送数据端可为:

    void send(Message msg)
    {
      boost::system::error_code ec;
      std::uint32_t posted = 0;
      std::uint32_t rest = msg.length();
    
      msg.encode_header();
    
      do 
    { auto asbuf
    = boost::asio::buffer(msg.data() + posted, rest); posted = _socket.write_some(asbuf, ec); if (ec) { break; } rest -= posted; } while (rest > 0); }

    资料参考:

    https://www.cnblogs.com/fnlingnzb-learner/p/10408812.html

  • 相关阅读:
    转-文件批量重命名
    解决死锁之路(终结篇)
    Python批量修改文件名
    Android AudioTrack分析
    Android Audio介绍
    Android GNSS介绍
    Android HIDL介绍
    【vue】类和内联样式绑定
    【vue】计算属性
    svn post-commit不能同步
  • 原文地址:https://www.cnblogs.com/qyit/p/13389547.html
Copyright © 2011-2022 走看看