IM_Client/api/core/management.cpp

89 lines
2.4 KiB
C++

//
// Created by dongl on 23-5-12.
//
#include <atomic>
#include <cstring>
#include <thread>
#include "management.h"
#include "MP/Response.h"
std::queue<agreement_response*> management::resp_msg;
void management::read_packet(bufferevent *bev) {
char buff[2048] = {0};
std::atomic<long> len_index = bufferevent_read(bev, buff, 2048);
// 处理粘包
char packet_h[50] = {0};
char packet_b[256] = {0};
while (len_index > 0) {
memset(packet_h, 0, sizeof(packet_h));
memset(packet_b, 0, sizeof(packet_b));
/// read L 读包长度
uint8_t packetLen;
// 取包长度
memcpy(&packetLen, buff, 1);
// 更新buffer
memcpy(buff, buff + 1, strlen(buff) - 1);
// 更新buffer长度
len_index -= 1;
/// read V 读包头
// 取包头
memcpy(packet_h, buff, packetLen);
// 更新buffer
memcpy(buff, buff + packetLen, strlen(buff) - packetLen);
// 更新buffer长度
len_index -= packetLen;
// 解包头
auto mph = new mp::mph();
mph->ParseFromString(packet_h);
/// read V 读包体 包头内含有包体长度
// 取包体
memcpy(packet_b, buff, mph->mpb_size());
// 更新buffer
memcpy(buff, buff + mph->mpb_size(), strlen(buff) - mph->mpb_size());
// 更新buffer长度
len_index -= mph->mpb_size();
// 解包体
auto response = new mp::response();
response->ParseFromString(packet_b);
auto resp = new agreement_response();
resp->set(response);
resp_msg.push(resp);
}
}
agreement_response management::fetch_packet() {
agreement_response ret;
auto beforeTime = std::chrono::steady_clock::now();
// double duration = 0;
while (resp_msg.empty()) {
// auto afterTime = std::chrono::steady_clock::now();
// duration += std::chrono::duration<double, std::milli>(afterTime - beforeTime).count();
//
// if (duration > 5000) {
//
// }
std::this_thread::sleep_for(std::chrono::microseconds(10));
}
auto afterTime = std::chrono::steady_clock::now();
ret = *resp_msg.front();
resp_msg.pop();
//毫秒级
double duration_millsecond = std::chrono::duration<double, std::milli>(afterTime - beforeTime).count();
std::cout << "" << duration_millsecond << "毫秒" << std::endl;
return ret;
}