#include <stdio.h>
|
|
#include <stdint.h>
|
|
#include <stdarg.h>
|
|
#include <time.h>
|
|
#include <unistd.h>
|
|
#include <ei.h>
|
|
#include <stdbool.h>
|
|
#include <string.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;
|
|
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);
|
|
ei_encode_string(gCmdBuff, &gIndex, "127.0.0.1");
|
|
ei_encode_ulong(gCmdBuff, &gIndex, 1111);
|
|
writeCmd(gCmdBuff, gIndex);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|