• 19.9 Boost Asio 同步字典传输


    这里所代指的字典是Python中的样子,本节内容我们将通过使用Boost中自带的Tokenizer分词器实现对特定字符串的切割功能,使用Boost Tokenizer,可以通过构建一个分隔符或正则表达式的实例来初始化tokenizer。然后,可以使用该实例对输入字符串进行划分。tokenizer将在输入字符串中寻找匹配输入模式的标记,并将其拆分为单独的字符串。

    首先我们先来看服务端是如何实现的,在服务端中我们接收客户端传递过来的GetProcess,lyshark.exe字符串,然后通过使用tokenizer分词器提取出其内部的lyshark.exe字符串,接着调用GetProcess函数将进程名传递进去,此时该函数会输出一个字典格式的字符串,此时通过write_some即可将该字符串发送给客户端。

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    using namespace boost;
    using boost::asio::ip::tcp;
    
    // 获取系统进程是否存在
    std::string GetProcess(const char *procressName)
    {
      boost::format fmt("{'ProcName' : %s , 'Count' : 1002 }");
      fmt %procressName;
      return fmt.str();
      return "{ 'ProcName' : 'None', 'Count' : 0 }";
    }
    
    int main(int argc, char* argv[])
    {
      try
      {
        asio::io_service io_service;
        tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 6666));
    
        while (1)
        {
          tcp::socket socket(io_service);
          acceptor.accept(socket);
    
          boost::array<char, 4096> buf;
          size_t len = socket.read_some(boost::asio::buffer(buf));
    
          // 判断第一个参数是否为GetProcess
          if (strncmp(buf.data(), "GetProcess", strlen("GetProcess")) == 0)
          {
            std::string strTag = buf.data();
            system::error_code ignored_error;
    
            // 通过分割器切割出前后数组
            boost::char_separator<char> sep(", ");
    
            typedef boost::tokenizer<boost::char_separator<char>> CustonTokenizer;
            CustonTokenizer tok(strTag, sep);
    
            // 迭代切割,并将结果放入vector容器
            std::vector<std::string> vecSegTag;
            for (CustonTokenizer::iterator beg = tok.begin(); beg != tok.end(); ++beg)
              vecSegTag.push_back(*beg);
    
            // 将第一个参数也就是 GetProcess,lyshark.exe 中的lyshark.exe 传入GetProcess函数
            std::string ref_string = GetProcess(const_cast<char *>(vecSegTag[1].c_str()));
            // 得到结果返回给客户端
            socket.write_some(asio::buffer(ref_string), ignored_error);
          }
        }
      }
      catch (std::exception& e)
      {
        std::cerr << e.what() << std::endl;
      }
      
      std::system("pause");
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    接着就是客户端部分,在该部分中我们构建GetProcess,lyshark.exe字符串并将该字符串write_some发送给服务端程序,接着通过read_some等待服务端传值,当收到传递过来的字典{'ProcName' : lyshark.exe , 'Count' : 1002 }则程序退出。

    #include 
    #include 
    #include 
    
    using namespace boost;
    using boost::asio::ip::tcp;
    
    int main(int argc, char* argv[])
    {
      try
      {
        boost::asio::io_service io_service;
        tcp::endpoint end_point(boost::asio::ip::address::from_string("127.0.0.1"), 6666);
    
        tcp::socket socket(io_service);
        socket.connect(end_point);
    
        system::error_code ignored_error;
    
        // 发送命令行
        std::string message = "GetProcess,lyshark.exe";
        socket.write_some(asio::buffer(message), ignored_error);
    
        // 获取远端返回结果
        boost::array<char, 4096> buf = { 0 };
        size_t len = socket.read_some(boost::asio::buffer(buf));
        std::cout << "返回数据: " << buf.data() << std::endl;
      }
      catch (std::exception& e)
      {
        std::cerr << e.what() << std::endl;
      }
    
      std::system("pause");
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    读者可自行编译并运行上述代码,客户端发送一个字符串,服务端处理后返回处理后的字典格式字符串,如下图所示;

  • 相关阅读:
    ABP - 模块加载机制
    ARM异常处理(1):异常类型、优先级分组和异常向量表
    JAVA环境配置(基础教学版:WIN11为例)
    软件工程-第7章 面向对象方法基础
    TypeScript系列之类型 void
    注释的重要性:代码的明晰之道
    【前端修炼场】 — 认识前端了解HTML(筑基期)
    使用 C 语言快速排序将字符串按照 ASCII 码升序排列
    JavaWeb AJAX请求
    归结原理、归结演绎推理
  • 原文地址:https://blog.csdn.net/lyshark_csdn/article/details/134324923