muduo网络库:21---muduo简介之(详解muduo多线程模型)

Posted 董哥的黑板报

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了muduo网络库:21---muduo简介之(详解muduo多线程模型)相关的知识,希望对你有一定的参考价值。

一、数独求解服务器

  • 假设有这么一个网络编程任务:写一个求解数独的程序(Sudoku Solver),并把它做成一个网络服务
  • Sudoku Solver在很多文章中出现过,例如:
    • “分布式系统部署、监控与进程管理的几重境界”
    • “muduo Buffer类的设 计与使用”
    • “‘多线程服务器的适用场合’例释与答疑”:https://blog.csdn.net/qq_41453285/article/details/105005152
    • 它也可以看成是echo服务的一个变种(附录A“谈一谈网络编程学习经验”把echo列为三大TCP网络编程案例之一)
  • 写这么一个程序在网络编程方面的难度不高,跟写echo服务差不多(从网络连接读入一个Sudoku题目,算出答案,再发回给客户),挑战在于怎样做才能发挥现在多核硬件的能力
  • 在谈这个问题之前,让我们先写一个基本的单线程版

协议设计

  • 一个简单的以\\r\\n分隔的文本行协议,使用TCP长连接,客户端在不需要服务时主动断开连接

  • 实例1:

  • 实例2:

  • 实例3:

  • 基于这个文本协议,我们可以用telnet模拟客户端来测试Sudoku Solver,不需要单独编写Sudoku Client。Sudoku Solver的默认端口号是9981(因为它有9×9=81个格子)

Sudoku Solver程序实现

  • Sudoku的求解算法见《谈谈数独(Sudoku)》一文(https://blog.csdn.net/Solstice/article/details/2096209),这不是本文的重点
  • 假设我们已经有一个函数能求解Sudoku,它的原型如下:
    • 参数为上面提到的的“<81digits>”
    • 返回值是“<81digits>”或“NoSolution”
    • 这个函数是个pure function,同时也是线程安全的
string sloveSudoku(const string& puzzle);
//onMessage()的主要功能是处理协议格式,并调用solveSudoku()求解问题。这个函数应该能正确处理TCP分包
void onMessage(const TcpConnectionPtr& conn, Buffer* buf, Timestamp)

    LOG_DEBUG << conn->name();
    size_t len = buf->readableBytes();
    while (len >= kCells + 2)
    
      const char* crlf = buf->findCRLF();
      if (crlf)
      
        string request(buf->peek(), crlf);
        buf->retrieveUntil(crlf + 2);
        len = buf->readableBytes();
        if (!processRequest(conn, request))
        
          conn->send("Bad Request!\\r\\n");
          conn->shutdown();
          break;
        
      
      else if (len > 100) // id + ":" + kCells + "\\r\\n"
      
        conn->send("Id too long!\\r\\n");
        conn->shutdown();
        break;
      
      else
      
        break;
      
    

 

以上是关于muduo网络库:21---muduo简介之(详解muduo多线程模型)的主要内容,如果未能解决你的问题,请参考以下文章

C++搭建集群聊天室:muduo网络库

C++搭建集群聊天室:muduo网络库

muduo库笔记汇总

从实例看muduo网络库各模块交互过程

Muduo网络库源码分析 EventLoop事件循环(Poller和Channel)

C++搭建集群聊天室:安装muduo网络库