C++ -- 负载均衡式在线OJ (二)

文章目录

  • 三、compile_server模块
    • 2.编译运行模块开发(compile_run模块)
      • jsoncpp库
      • compile_run模块
      • 设计测试用例对compile_run模块进行测试
      • 引入cpp-httplib第三方网络库

前面部分请看这里C++ – 负载均衡式在线OJ (一)

三、compile_server模块

2.编译运行模块开发(compile_run模块)

编写compile_run模块去进行组合。compile_run模块就需要去适配用户请求,定制通信协议字段,然后逐次完善功能,正确的调用compile和runner
C++ -- 负载均衡式在线OJ (二)_第1张图片

jsoncpp库

jsoncpp最简单的用法就是创建一个Value类型的万能对象,然后以KV的方式进行序列化,然后给对方,对端接收到之后进行read反序列化

#include 
#include 
int main()
{
   
	Json::Value root;
	root["code"] = "mycode";//KV的形式,读的时候就可以通过key读出value
	root["user"] = "zhupi";
	root["age"] = "19";
	//序列化
	Json::StyleWriter writer;//不止一种序列化的类,区别就在于形成的json string不同
	std::string str = writer.write(root);//str就是序列化之后的结果 
	std::cout<<str<<std::endl;
}

//假设对端接收到了一个json string
void jsonTest(const std::string & in_json)
{
   
	Json::Value in_value;
	Json::Reader reader;//反序列化对象
	reader.parse(in_json,in_value);//把in_json反序列化到in_value当中
	std::string code = in_value["code"].asString(); // 当成字符串
    std::string user = in_value["user"].asString();	
    std::string age = in_value["age"].asString();	
    //就得到了对端发给我的结果
}

注意: 因为我们使用了jsoncpp,他是一个第三方库,在编译的时候我们需要给g++一些选项,g++ -o test test.cc -std=c++11 -ljsoncpp

compile_run模块

明确步骤:

  1. 把被人通过网络传给我们的json string 反序列化,取出里面规定好的内容(这是我们定制的协议,我们 规定里面需要有code代码,input自测输入(目前不支持),cpu_limit占用时间限制,mem_limit占用空间限制)
  2. 生成独特的文件名,不能和其他的起冲突,这个文件名就用来后面生成本次提供编译运行服务的临时文件。
  3. 生成一份源文件程序,把code代码放进去
  4. 正确调用compiler和runner模块的接口进行处理(编译运行)
  5. 结果发回给对端

独特文件名的形成

我们采用毫秒级时间戳和原子性的唯一值来保证形成的文件名的唯一性,或者我们用mutex互斥锁去进行计数也是一样的。

在comm模块中的util.hpp中

namespace ns_util
{
   
    class TimeUtil
    {
   
    public:
        static std::string GetTimeStamp()
        {
   
            struct timeval _time;
            gettimeofday(&_time, nullptr);
            return std::to_string(_time.tv_sec);
        }

        // 获得毫秒时间戳
        static std::string GetTimeMs()
        {
   
            struct timeval _time;
            gettimeofday(&_time, nullptr);
            return std::to_string(_time.tv_sec * 1000 + _time.tv_usec / 1000);
        }
    };
}

唯一文件名及读写文件接口

在comm模块中的util.hpp中

namespace ns_util
{
   
    class FileUtil
    {
   
    public:
        static std::string UniqFileName()
        {
   
            static std::atomic_uint id(0);
            id++;
            // 毫秒级时间戳+原子性递增唯一性:来保证唯一性
            std::string ms = TimeUtil::GetTimeMs();
            std::string uniq_id = std::to_string(id);
            return ms + "_" + uniq_id;
        }
    };
	
		static bool WriteFile(const std::string &target, const std::string &code)
        {
   
            std::ofstream out(target);
            if (!out.is_open())
                return

你可能感兴趣的:(负载均衡OJ,c++,负载均衡,开发语言)