需求:实现一个在线判题系统,用户通过浏览器编写和提交代码,通过网络传输,将代码上传到后台,后台对提交的代码进行编译运行,将编译运行结果反馈给用户 在线OJ前后台的流程:
第三方库:httplib,json,ctemplate,boost
项目分为五大模块: 网络服务模块 搭建http服务器: 本人采用的是GitHub上提供的开源的httplib.h库,在搭建http服务的时候,只需要我们包含该头文件就可以使用了 提供http服务,串联试题模块和编译运行模块 1.获取题目列表 2.提交选中的题目 3.提交题目代码和题目描述,代码的编译框 试题模块 1.从配置文件中加载题目 a.配置文件格式: 约定配置文件当中对题目的描述 题目的编号,题目的名字,题目所在的目录,题目难度 b.加载题目的配置文件,使用数据结构保存加载出来的题目的介绍信息 c.针对每一道题目而言,需要根据给出的路径进行加载 2.提供获取整体题目的接口 给网络服务模块提供一个可以获取所有题目描述的接口,展示给用户 3.提供单个题目的接口 给网络服务模块获取单个题目描述和作答的接口,展示给用户 编译运行模块 1.编译 a.将用户提交的代码写到文件中 b.创建子进程,并且进行程序替换为g++程序,进行编译源码文件 c.获取编译结果写到标准输出文件当中或者写入标准错误文件中 2.运行 a.如果代码走到运行阶段,说明一定编译出来可执行程序了,创建子进程,并且让子进程进行程序替换,替换成可执行程序 b.将程序运行结果,保存到标准输出或者标准错误文件中 日志模块 1.提供时间戳服务:为了区分不同的用户提交的代码,当代码写到文件当中的时候,使用时间戳来进行一个区分 工具模块 1.实现切割字符串的函数 2.提供写文件操作 3.提供读文件操作 4.提供URL解码操作
源码地址:https://github.com/wake5up/My-c--code/tree/master/OJ-project