|
|
@ -0,0 +1,150 @@ |
|
|
|
#include <stdio.h> |
|
|
|
#include <stdint.h> |
|
|
|
#include <stdarg.h> |
|
|
|
#include <time.h> |
|
|
|
#include <unistd.h> |
|
|
|
#include <ei.h> |
|
|
|
|
|
|
|
#define BUFF_LEN 256 |
|
|
|
bool gIsBigEndian; // 是否大端格式 |
|
|
|
char gCmdBuff[BUFF_LEN] = {}; |
|
|
|
int gIndex = 0; |
|
|
|
uint64_t gReqId = 0; |
|
|
|
|
|
|
|
void DebugLog(const char *ms, ...) { |
|
|
|
char wzLog[360] = {0}; |
|
|
|
char buffer[380] = {0}; |
|
|
|
char filename[30] = {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); |
|
|
|
sprintf(filename, "./log/%04d-%02d-%02d_i5_sdk.log", local->tm_year + 1900, local->tm_mon + 1, local->tm_mday); |
|
|
|
sprintf(buffer, "%04d-%02d-%02d %02d:%02d:%02d %s\n", local->tm_year + 1900, local->tm_mon + 1, local->tm_mday, |
|
|
|
local->tm_hour, local->tm_min, local->tm_sec, wzLog); |
|
|
|
|
|
|
|
FILE *file = fopen(filename, "a+"); |
|
|
|
if (file != NULL) { |
|
|
|
fwrite(buffer, 1, strlen(buffer), file); |
|
|
|
fclose(file); |
|
|
|
} |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
int checkEndian(void) { |
|
|
|
union { |
|
|
|
uint16_t i; |
|
|
|
char c[2]; |
|
|
|
} value = {0x0102}; |
|
|
|
|
|
|
|
return value.c[0] == 1; |
|
|
|
} |
|
|
|
|
|
|
|
uint16_t swapByteOrder(uint16_t ui) { |
|
|
|
ui = ((ui & 0xff00) >> 8) | ((ui & 0x00ff) << 8); |
|
|
|
return ui; |
|
|
|
} |
|
|
|
|
|
|
|
int readExact(char *buf, int len) { |
|
|
|
int i, got = 0; |
|
|
|
do { |
|
|
|
if ((i = read(0, buf + got, len - got)) <= 0) { |
|
|
|
return (i); |
|
|
|
} |
|
|
|
got += i; |
|
|
|
} while (got < len); |
|
|
|
|
|
|
|
return (len); |
|
|
|
} |
|
|
|
|
|
|
|
int writeExact(char *buf, int len) { |
|
|
|
int i, wrote = 0; |
|
|
|
|
|
|
|
do { |
|
|
|
if ((i = write(1, buf + wrote, len - wrote)) <= 0) |
|
|
|
return (i); |
|
|
|
wrote += i; |
|
|
|
} while (wrote < len); |
|
|
|
|
|
|
|
return (len); |
|
|
|
} |
|
|
|
|
|
|
|
int readCmd(char *buf) { |
|
|
|
uint16_t len; |
|
|
|
if (readExact((char *) &len, sizeof(len)) != sizeof(len)) |
|
|
|
return (-1); |
|
|
|
if (!gIsBigEndian) |
|
|
|
len = swapByteOrder(len); |
|
|
|
return readExact(buf, len); |
|
|
|
} |
|
|
|
|
|
|
|
int writeCmd(char *buf, int len) { |
|
|
|
uint16_t wLen = uint16_t(gIndex); |
|
|
|
if (!gIsBigEndian) |
|
|
|
wLen = swapByteOrder(wLen); |
|
|
|
writeExact((char *) (&wLen), sizeof(wLen)); |
|
|
|
return writeExact(buf, len); |
|
|
|
} |
|
|
|
|
|
|
|
int main(void) { |
|
|
|
gIsBigEndian = checkEndian(); |
|
|
|
|
|
|
|
DebugLog("IMY*************main00000 %d\n", 11111); |
|
|
|
while (readCmd(gCmdBuff) > 0) { |
|
|
|
gIndex = 0; |
|
|
|
int arity = 0; |
|
|
|
int version = 0; |
|
|
|
DebugLog("IMY*************while11111 %s\n", gCmdBuff); |
|
|
|
ei_decode_version(gCmdBuff, &gIndex, &version); |
|
|
|
ei_decode_tuple_header(gCmdBuff, &gIndex, &arity); |
|
|
|
|
|
|
|
char cmdId; |
|
|
|
ei_decode_char(gCmdBuff, &gIndex, &cmdId); |
|
|
|
DebugLog("IMY*************while2222 %c\n", cmdId); |
|
|
|
switch (cmdId) { |
|
|
|
case 'i': { // 初始化sdk |
|
|
|
// 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); |
|
|
|
DebugLog("IMY************init %d %d \n", sdkCmdId, sdkCmd); |
|
|
|
int ret = 0; |
|
|
|
gIndex = 0; |
|
|
|
memset(gCmdBuff, 0, BUFF_LEN); |
|
|
|
ei_encode_version(gCmdBuff, &gIndex); |
|
|
|
ei_encode_tuple_header(gCmdBuff, &gIndex, 1); |
|
|
|
ei_encode_long(gCmdBuff, &gIndex, ret); |
|
|
|
writeCmd(gCmdBuff, gIndex); |
|
|
|
} |
|
|
|
break; |
|
|
|
case 'g': { // 获取Ip:port |
|
|
|
// 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); |
|
|
|
DebugLog("IMY************getip %d %d \n", sdkCmdId, sdkCmd); |
|
|
|
uint64_t reqId = 0; |
|
|
|
gIndex = 0; |
|
|
|
memset(gCmdBuff, 0, BUFF_LEN); |
|
|
|
ei_encode_version(gCmdBuff, &gIndex); |
|
|
|
ei_encode_tuple_header(gCmdBuff, &gIndex, 3); |
|
|
|
ei_encode_ulong(gCmdBuff, &gIndex, reqId); |
|
|
|
REQCACHE cache = reqCache[reqId]; |
|
|
|
ei_encode_string(gCmdBuff, &gIndex, cache.req._host_ip.c_str()); |
|
|
|
ei_encode_ulong(gCmdBuff, &gIndex, cache.req._host_port); |
|
|
|
writeCmd(gCmdBuff, gIndex); |
|
|
|
} |
|
|
|
break; |
|
|
|
default: |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
return 0; |
|
|
|
} |