erlang port
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 

170 行
5.0 KiB

#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;
}