#include <iostream>
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <map>
|
|
#include <ei.h>
|
|
|
|
|
|
#include <time.h>
|
|
#include <stdarg.h>
|
|
#include <syslog.h>
|
|
# include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#define BUFF_LEN 256
|
|
std::map<u_int64_t, int> reqCache;
|
|
bool gIsBigEndian;
|
|
char gCmdBuff[BUFF_LEN] = {};
|
|
int gIndex = 0;
|
|
u_int64_t gReqId = 0;
|
|
|
|
|
|
|
|
void LOG(const char* ms, ... ) {
|
|
char wzLog[1024] = {0};
|
|
char buffer[1024] = {0};
|
|
va_list args;
|
|
va_start(args, ms);
|
|
vsprintf(wzLog, ms, args);
|
|
va_end(args);
|
|
|
|
time_t now;
|
|
time(&now);
|
|
struct tm *local;
|
|
local = localtime(&now);
|
|
printf("%04d-%02d-%02d %02d:%02d:%02d %s\n", local->tm_year + 1900, local->tm_mon,
|
|
local->tm_mday, local->tm_hour, local->tm_min, local->tm_sec,
|
|
wzLog);
|
|
sprintf(buffer, "%04d-%02d-%02d %02d:%02d:%02d %s\n", local->tm_year + 1900, local->tm_mon,
|
|
local->tm_mday, local->tm_hour, local->tm_min, local->tm_sec,
|
|
wzLog);
|
|
FILE *file = fopen("debug.log", "a+");
|
|
fwrite(buffer, 1, strlen(buffer), file);
|
|
fclose(file);
|
|
|
|
// syslog(LOG_INFO,wzLog);
|
|
return;
|
|
}
|
|
|
|
|
|
int checkEndian(void) {
|
|
union {
|
|
uint16_t i;
|
|
char c[2];
|
|
} value = {0x0102};
|
|
|
|
return value.c[0] == 1;
|
|
}
|
|
|
|
uint16_t swapByteOrder(uint16_t ui) {
|
|
LOG("IMY***********************swapByteOrder111 %d", ui);
|
|
ui = ((ui & 0xff00) >> 8) | ((ui & 0x00ff) << 8);
|
|
LOG("IMY***********************swapByteOrder222 %d", ui);
|
|
return ui;
|
|
}
|
|
|
|
uint16_t readLen(std::istream &s) {
|
|
uint16_t len;
|
|
s.read(reinterpret_cast<char *>(&len), sizeof(len));
|
|
if (!gIsBigEndian)
|
|
len = swapByteOrder(len);
|
|
// std::cerr << 'r' << len << ' ';
|
|
// std::cerr.flush();
|
|
return len;
|
|
}
|
|
|
|
std::ostream &writeLen(std::ostream &s, uint16_t len) {
|
|
// std::cerr << 'w' << len << ' ';
|
|
// std::cerr.flush();
|
|
|
|
if (!gIsBigEndian)
|
|
len = swapByteOrder(len);
|
|
s.write(reinterpret_cast<char *>(&len), sizeof(len));
|
|
return s;
|
|
}
|
|
|
|
|
|
int main(void) {
|
|
gIsBigEndian = checkEndian();
|
|
|
|
// Helps to detect std::cin closing
|
|
std::cin.exceptions(std::istream::failbit | std::istream::badbit);
|
|
|
|
// Read buffer's length
|
|
while (true) {
|
|
// read len, 2 bytes
|
|
uint16_t rLen = readLen(std::cin);
|
|
|
|
// read data, len bytes
|
|
std::cin.read(gCmdBuff, rLen);
|
|
gIndex = 0;
|
|
int arity = 0;
|
|
LOG("IMY*************00000 %d %s", rLen, gCmdBuff);
|
|
int version = 0;
|
|
ei_decode_version(gCmdBuff, &gIndex, &version);
|
|
|
|
ei_decode_tuple_header(gCmdBuff, &gIndex, &arity);
|
|
|
|
LOG("IMY*************000111 %d", arity);
|
|
char cmdId;
|
|
ei_decode_char(gCmdBuff, &gIndex, &cmdId);
|
|
LOG("IMY*************11111 %c", cmdId);
|
|
switch (cmdId) {
|
|
case 'g':
|
|
LOG("IMY*************2222222 %s", gCmdBuff);
|
|
// get the ip port reqId 先读取 cmdid, cmd
|
|
unsigned long sdkCmdId;
|
|
unsigned long sdkCmd;
|
|
ei_decode_ulong(gCmdBuff, &gIndex, &sdkCmdId);
|
|
ei_decode_ulong(gCmdBuff, &gIndex, &sdkCmd);
|
|
|
|
LOG("IMY************2222221111* %c %d %d ", cmdId, sdkCmdId, sdkCmd);
|
|
// 调用函数
|
|
// SKDAPI(xxxxx)
|
|
// 存储 map gReqId => cache
|
|
// 获取 reqId
|
|
|
|
// 编码结果
|
|
gReqId += 1;
|
|
gIndex = 0;
|
|
memset(gCmdBuff, 0, BUFF_LEN);
|
|
ei_encode_version(gCmdBuff, &gIndex);
|
|
ei_encode_tuple_header(gCmdBuff, &gIndex, 3);
|
|
ei_encode_char(gCmdBuff, &gIndex, cmdId);
|
|
ei_encode_ulong(gCmdBuff, &gIndex, sdkCmdId);
|
|
ei_encode_ulong(gCmdBuff, &gIndex, sdkCmd);
|
|
//ei_encode_tuple_header(gCmdBuff, &gIndex, 2);
|
|
//ei_encode_ulong(gCmdBuff, &gIndex, gReqId);
|
|
//ei_encode_ulong(gCmdBuff, &gIndex, 12369);
|
|
//ei_encode_string(gCmdBuff, &gIndex, "127.0.0.1");
|
|
|
|
LOG("IMY************222222112222* %d", gIndex);
|
|
writeLen(std::cout, uint16_t(gIndex));
|
|
std::cout.write(gCmdBuff, gIndex);
|
|
std::cout.flush();
|
|
break;
|
|
case 'u':
|
|
LOG("IMY*************333333 %c", cmdId);
|
|
// 获取消耗时间 reqId
|
|
unsigned long useTime;
|
|
unsigned long reqId;
|
|
ei_decode_ulong(gCmdBuff, &gIndex, &useTime);
|
|
ei_decode_ulong(gCmdBuff, &gIndex, &reqId);
|
|
// 获取 map gReqId => cache
|
|
// 执行上报sdk
|
|
break;
|
|
case 't':
|
|
// 遍历map 删除过期的缓存
|
|
LOG("IMY*************444444 %c", cmdId);
|
|
break;
|
|
default :
|
|
LOG("IMY*************55555 %c", cmdId);
|
|
writeLen(std::cout, rLen);
|
|
std::cout.write(gCmdBuff, rLen);
|
|
std::cout.flush();
|
|
break;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|