erlang port
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

153 行
4.4 KiB

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