C++项目 -- 负载均衡OJ(一)comm

C++项目 – 负载均衡OJ(一)comm


一、项目宏观结构

1.项目功能

本项目的功能为一个在线的OJ,实现类似leetcode的题目列表、在线提交、编译、运行等功能。

2.项目结构

该项目一共三个模块:

  • comm : 公共模块
  • compile_server : 编译与运行模块
  • oj_server : 获取题目列表,查看题目编写题目界面,负载均衡,其他功能

代码由客户端编写完成后,上传到服务端oj_server,由oj_server根据compile_server的负载情况选择相应的服务,来进行代码的编译与运行,结果再由oj_server返回给客户端,是基于BS模式(浏览器(客户端)-服务端)编写的。
在这里插入图片描述

二、comm公共模块

该模块用于编写一些公共方法;

1.util.hpp

util.hpp代码

  • PathUtil类中用于实现一些针对文件路径的方法;

    • Src, Exe, Stderr,CompilerError,Stdin,Stdout三个方法用于根据源cpp文件的前缀名(如1234.cpp的前缀名1234),生成文件名对应的带路径的.cpp,.exe,.stderr, .compiler_error, .stdin, .stdout文件名,路径为现在路径下的temp子路径;
  • FileUtil类中用于实现一些针对文件的方法;

    • IsFileExists用于判断文件是否存在,使用stat接口:
      在这里插入图片描述
      stat接口用于获取文件的相关属性,获取完成后保存在stat结构体中,如果获取成功,返回0,失败则返回-1;
    • UniqueFileName函数用于该路径下生成唯一的文件名,使用的方法是毫秒级时间戳 + 原子性递增的唯一值:
      atomic是c++11中提供的原子级的计数器;
    • ReadFile函数用于读取文件内容;
      getline不保存行分隔符,函数的keep参数用于选择是否在行尾保留\n;
      getline内部重载了强制类型转化,可以返回bool值用于while判断;
    • WriteFile用于将内容写入目标文件中
  • TimeUtil类用于实现一些针对时间的方法;

    • GetTimeStamp函数用于获取时间戳,以字符串的形式返回,使用gettimeofday接口,其中tv是保存时间的结构体,tz是保存时区的结构体,返回时将tv中的秒返回;
      在这里插入图片描述
      在这里插入图片描述
    • GetTimeMs用于返回毫秒级时间戳,返回的是timeval结构体中的tv_sectv_usec换算成毫秒的数值;
  • StringUtil类用于实现以下字符串操作的接口;

    • SpiltString函数功能是切分字符串,主要是调用了boost库中的split函数,该函数的用法为:
      在这里插入图片描述
      tokens参数用于保存切分结果;
      str参数是需要切分的字符串;
      is_any_of(sep)是分隔符,可以有多种;
      token_compress_on是否需要压缩字符串,用于两个分割符之间如果什么都没有,还需不需要保留中间内容,on是不保留,off是保留
      在这里插入图片描述

2.log.hpp

log.hpp代码

该文件中用于实现日志相关的接口:

  • 日志等级使用枚举类型,实际上是整数;
  • 日志函数Log的功能是打印日志信息,包括日志等级、文件名、代码行数、时间戳、自定义信息的内容,代码的返回值类型为标准输出流,输出流是有缓冲区的,因此可以在调用Log函数后,不使用endl刷新缓冲区,可以在后面自由拼接一些自定义信息;
  • 由于Log会经常调用,因此设计成inline;
  • 在使用日志接口时,不想传文件名和行数信息,可以使用宏来替代Log函数:
    在这里插入图片描述
    • level参数是string类型,但是日志等级是枚举类型,本质是整数,我们可以在宏替换时给Log函数的level宏参数加#,可以将宏参数直接以字符串的方式传入;
    • __FILE____LINE__是C++中的宏,代表当前的源文件和行数;
    • 宏替换的时候,就是将替换的内容直接在代码调用处插入;

相关推荐

  1. 负载均衡在线OJ项目日记】运行功能开发

    2024-04-14 05:40:01       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-14 05:40:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-14 05:40:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-14 05:40:01       82 阅读
  4. Python语言-面向对象

    2024-04-14 05:40:01       91 阅读

热门阅读

  1. Linux上安装Redis

    2024-04-14 05:40:01       44 阅读
  2. CSS设置元素的宽高比

    2024-04-14 05:40:01       40 阅读
  3. TCP/IPv4 开发过程中不要开启VPN

    2024-04-14 05:40:01       38 阅读
  4. 自动驾驶仿真测试的难点

    2024-04-14 05:40:01       38 阅读
  5. 【架构-11】SOA和微服务?

    2024-04-14 05:40:01       31 阅读
  6. C语言游戏实战(8):飞机大作战

    2024-04-14 05:40:01       34 阅读
  7. ip addr和ifconfig区别

    2024-04-14 05:40:01       42 阅读
  8. 从零开始写一个RTSP服务器(二)RTSP协议的实现

    2024-04-14 05:40:01       37 阅读