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;
      }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董哥的黑板报

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值