This commit is contained in:
cheney 2026-07-10 17:53:18 +08:00
commit 7ec0389a8a
35 changed files with 10836 additions and 0 deletions

36
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,36 @@
{
// 使 IntelliSense
//
// 访: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "gcc - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
//"program": "${fileDirname}/${fileBasenameNoExtension}",
"program": "/mnt/hgfs/D/work/信雅达科技有限公司/2025年/5、金交所存储加密改造/密码设备应用软件_C接口程序_黄金交易所版(存储加密)_bld_1.18/lib/demo",
"args": [],
"stopAtEntry": false,
//"cwd": "${fileDirname}",
"cwd": "/mnt/hgfs/D/work/信雅达科技有限公司/2025年/5、金交所存储加密改造/密码设备应用软件_C接口程序_黄金交易所版(存储加密)_bld_1.18/lib",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: gcc 生成活动文件",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}

10
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,10 @@
{
"files.associations": {
"threadpool.h": "c",
"typedef.h": "c",
"log.h": "c",
"in.h": "c",
"sunyard_d.h": "c",
"sunyard.h": "c"
}
}

48
.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,48 @@
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc build active file",
"command": "/usr/bin/gcc",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "Task generated by Debugger."
},
{
"type": "cppbuild",
"label": "C/C++: gcc 生成活动文件",
"command": "/usr/bin/gcc",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}

54
demo/Makefile Normal file
View File

@ -0,0 +1,54 @@
# SlickEdit generated file. Do not edit this file except in designated areas.
# Make command to use for dependencies
MAKE=make
RM=rm
MKDIR=mkdir
# -----Begin user-editable area-----
# -----End user-editable area-----
# If no configuration is specified, "Debug" will be used
ifndef CFG
CFG=Debug
endif
#
# Configuration: Debug
#
ifeq "$(CFG)" "Debug"
OUTDIR=Debug
OUTFILE=../lib/demo
CFG_INC=-I../inc
CFG_LIB=-lsunyard -lpthread
CFG_OBJ=
COMMON_OBJ=$(OUTDIR)/demo.o $(OUTDIR)/demo_api.o
OBJ=$(COMMON_OBJ) $(CFG_OBJ)
ALL_OBJ=$(OUTDIR)/demo.o $(OUTDIR)/demo_api.o
COMPILE=gcc -c -g -o "$(OUTDIR)/$(*F).o" $(CFG_INC) $<
LINK=gcc -g -L ../lib -o "$(OUTFILE)" $(ALL_OBJ) $(CFG_LIB) -Wl,-rpath=../lib
# Pattern rules
$(OUTDIR)/%.o : %.c
$(COMPILE)
# Build rules
all: $(OUTFILE)
$(OUTFILE): $(OUTDIR) $(OBJ)
$(LINK)
$(OUTDIR):
$(MKDIR) -p "$(OUTDIR)"
# Rebuild this project
rebuild: cleanall all
# Clean this project
clean:
$(RM) -f $(OUTFILE)
$(RM) -f $(OBJ)
# Clean this project and all dependencies
cleanall: clean
endif

579
demo/demo.c Normal file
View File

@ -0,0 +1,579 @@
#ifndef _DEMO_API_H_
#include "demo_api.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "demo_xn.c"
static pthread_mutex_t g_mutex;
static float g_allflow[300] = {0};
static unsigned long g_threadnum = 0;
typedef struct {
int datalen;
int cmd;
}XN_INFO;
int connect_test()
{
int ret = 0, i = 0;
void *hHandle = NULL;
const char *iplist[5] = {0};
int port[5] = {0};
iplist[0] = DEV_IP;
port[0] = DEV_PORT;
iplist[1] = DEV_IP;
port[1] = DEV_PORT;
for(i = 0; i < 10; i++)
{
ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, DEAL_TIMEOUT, 0, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return -1;
}
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return -1;
}
LOG("短连接正常测试|线程数:0|单个连接|成功");
}
for(i = 0; i < 10; i++)
{
ret = SYD_Connect_Ex(iplist, port, 2, CON_TIMEOUT, DEAL_TIMEOUT, 0, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return -1;
}
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return -1;
}
LOG("短连接正常测试|线程数:0|2个连接|成功");
}
for(i = 0; i < 10; i++)
{
ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, DEAL_TIMEOUT, 5, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return -1;
}
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return -1;
}
LOG("短连接正常测试|线程数:5|单个连接|成功");
}
for(i = 0; i < 10; i++)
{
ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, DEAL_TIMEOUT, 5, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return -1;
}
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return -1;
}
LOG("短连接正常测试|线程数:5|2个连接|成功");
}
return 0;
}
int CMD(void *hHandle, int cmd)
{
int ret = 0;
switch(cmd)
{
case 0:
ret = SM4_ShortData_Test(hHandle);
break;
case 1:
ret = SM4_BatchData_Test(hHandle);
break;
case 2:
ret = SM4_LongData_Test_Special(hHandle);
if(ret != 0)
{
return ret;
}
ret = SM4_LongData_Test(hHandle);
if(ret != 0)
{
return ret;
}
break;
case 3:
ret = SM3_ShortHash_Test(hHandle);
break;
case 4:
ret = SM3_LongHash_Test_Special(hHandle);
if(ret != 0)
{
return ret;
}
ret = SM3_LongHash_Test(hHandle);
if(ret != 0)
{
return ret;
}
break;
case 5:
ret = SM4Mac_ShortData(hHandle);
break;
case 6:
ret = SM4Mac_BatchData(hHandle);
break;
case 7:
ret = SM4Mac_LongData_Special(hHandle);
if(ret != 0)
{
return ret;
}
ret = SM4Mac_LongData(hHandle);
if(ret != 0)
{
return ret;
}
break;
case 8:
ret = SM4_ShortData_CheckValue(hHandle);
break;
case 9:
ret = SM4_BatchData_CheckValue(hHandle);
break;
case 10:
ret = SM4_LongData_CheckValue(hHandle);
break;
default:
LOG("cmd not exit");
ret = 1;
}
return ret;
}
void short_connect_test()
{
int ret = 0, cmd = 0, i = 0;
void *hHandle = NULL;
const char *iplist[2] = {0};
int port[2] = {0};
iplist[0] = DEV_IP;
port[0] = DEV_PORT;
iplist[1] = DEV2_IP;
port[1] = DEV2_PORT;
for(i = 0; i < 10; i++)
{
ret = SYD_Connect_Ex(iplist, port, 2, CON_TIMEOUT, DEAL_TIMEOUT, 0, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return;
}
for(cmd = 0; cmd <= 9; cmd++)
{
ret = CMD(hHandle, cmd);
if(ret != 0) goto END;
}
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return;
}
LOG("遍历所有指令|总循环次数:10|已执行次数:%d|成功", i+1);
}
END:
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return;
}
}
void threadpool_connect_test()
{
int ret = 0, i = 0, cmd = 0;
void *hHandle = NULL;
const char *iplist[2] = {0};
int port[2] = {0};
iplist[0] = DEV_IP;
port[0] = DEV_PORT;
iplist[1] = DEV2_IP;
port[1] = DEV2_PORT;
for(i = 0; i < 10; i++)
{
ret = SYD_Connect_Ex(iplist, port, 2, CON_TIMEOUT, DEAL_TIMEOUT, 5, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return;
}
for(cmd = 0; cmd <= 9; cmd++)
{
ret = CMD(hHandle, cmd);
if(ret != 0) goto END;
}
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return;
}
LOG("遍历所有指令|总循环次数:10|已执行次数:%d|成功", i+1);
}
END:
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return;
}
}
void choose_cmd_test()
{
int ret = 0, i = 0;
int cmd = 0;
void *hHandle = NULL;
const char *iplist[2] = {0};
int port[2] = {0};
iplist[0] = DEV_IP;
port[0] = DEV_PORT;
iplist[1] = DEV2_IP;
port[1] = DEV2_PORT;
while (1)
{
LOG_MSG("/----功能正确性测试-----/");
LOG_MSG("0:SM4短数据");
LOG_MSG("1:SM4批量数据");
LOG_MSG("2:SM4长数据");
LOG_MSG("3:SM3短数据");
LOG_MSG("4:SM3长数据");
LOG_MSG("5:SM4-MAC短数据");
LOG_MSG("6:SM4-MAC批量数据");
LOG_MSG("7:SM4-MAC长数据");
LOG_MSG("8:SM4短数据+密文校验");
LOG_MSG("9:SM4批量数据+密文校验");
LOG_MSG("10:SM4长数据+密文校验");
LOG_MSG("100:退出");
LOG_MSG("请选择测试指令:");
scanf("%d", &cmd);
if(cmd == 100) return;
ret = SYD_Connect_Ex(iplist, port, 2, CON_TIMEOUT, DEAL_TIMEOUT, 0, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return;
}
ret = CMD(hHandle, cmd);
if(ret == 1) goto END;
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return;
}
}
END:
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return;
}
}
void* CMD_XN(void *p)
{
XN_INFO* arg = (XN_INFO *)p;
int ret = 0;
float flow = 0;
long difftime = 0;
struct timeval start_time;
struct timeval local_time;
const char *iplist[5] = {0};
int port[5] = {0};
iplist[0] = DEV_IP;
port[0] = DEV_PORT;
void *hHandle = NULL;
ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, 1000, 0, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return NULL;
}
gettimeofday(&start_time, NULL);
switch(arg->cmd)
{
case 0:
ret = XN_SM4_Enc_LongData_Test(hHandle, arg->datalen);
break;
case 1:
ret = XN_SM4_Dec_LongData_Test(hHandle, arg->datalen);
break;
case 2:
ret = XN_SM4Mac_LongData_Test(hHandle, arg->datalen);
break;
case 3:
ret = XN_SM3_LongHash_Test(hHandle, arg->datalen);
break;
case 4:
ret = XN_SM4EncMac_LongData_Test(hHandle, arg->datalen);
break;
case 5:
ret = XN_SM4DecMac_LongData_Test(hHandle, arg->datalen);
break;
default:
LOG("cmd not exist");
return NULL;
}
gettimeofday(&local_time, NULL);
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return NULL;
}
pthread_mutex_lock(&g_mutex);
difftime = us_difftime(start_time, local_time);
flow = (arg->datalen / (difftime * 0.000001)) / (1024 * 1024);
g_allflow[g_threadnum] = flow;
LOG_MSG("线程:%ld|用时%ld(us)|数据长度:%d(bytes)|吞吐量:%f(MB/S)", g_threadnum, difftime, arg->datalen, flow);
g_threadnum++;
pthread_mutex_unlock(&g_mutex);
return NULL;
}
void xn_throughput_test()
{
int ret = 0, i = 0, cmd = 0;
long alldatalen = 0;
int run_conut = 0;
float all_flow = 0;
long thread_count = 0;
pthread_t pthid[1000];
XN_INFO arg = {0};
pthread_mutex_init(&g_mutex, NULL);
while (1)
{
LOG_MSG("/------吞吐量测试------/");
LOG_MSG("0:SM4加密长数据");
LOG_MSG("1:SM4解密长数据");
LOG_MSG("2:SM4-MAC长数据");
LOG_MSG("3:SM3长数据");
LOG_MSG("4:SM4加密+MAC长数据");
LOG_MSG("5:SM4解密+MAC长数据");
LOG_MSG("100:退出");
LOG_MSG("请选择测试指令:");
scanf("%d", &cmd);
if(cmd == 100) goto END;
LOG_MSG("请输出数据的总长度(MB):");
scanf("%ld", &alldatalen);
alldatalen = alldatalen * 1024 * 1024;
LOG_MSG("请输入线程数:");
scanf("%ld", &thread_count);
g_threadnum = 0;
memset(g_allflow, 0, sizeof(g_allflow));
arg.cmd = cmd;
arg.datalen = alldatalen / thread_count;
for(i = 0; i < thread_count; i++)
{
ret = pthread_create(&pthid[i], NULL, CMD_XN, (void *)&arg);
if(ret)
{
printf("Fail to create thread %d\n", (int)pthid[i]);
goto END;
}
}
for (i = 0; i < thread_count; i++)
{
ret = pthread_join(pthid[i],NULL);
if(ret)
{
printf("Thread %d join failed\n", (int)pthid[i]);
goto END;
}
}
all_flow = 0;
for (i = 0; i < thread_count; i++)
{
all_flow += g_allflow[i];
}
LOG_MSG("命令:%d|线程数:%ld|总吞吐量:%f(MB/S)", arg.cmd, thread_count, all_flow);
}
END:
pthread_mutex_destroy(&g_mutex);
}
int stability_test()
{
int ret = 0, cmd = 0;
long long i = 0, count = 0;
void *hHandle = NULL;
const char *iplist[2] = {0};
int port[5] = {0};
iplist[0] = DEV_IP;
port[0] = DEV_PORT;
ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, 5000, 0, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return 0;
}
LOG_MSG("请输入循环次数:");
scanf("%lld", &count);
for(i = 0; i < count; i++)
{
for(cmd = 0; cmd <= 10; cmd++)
{
ret = CMD(hHandle, cmd);
if(ret != 0)
{
LOG("命令:%d|当前循环次数:%lld|错误!", cmd, i);
goto END;
}
}
}
END:
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return 0;
}
}
int main()
{
int ret = 0, mode = 0;
void *hHandle = NULL;
char version[256] = {0};
int version_len = sizeof(version);
const char *iplist[5] = {0};
int port[5] = {0};
iplist[0] = DEV_IP;
port[0] = DEV_PORT;
ret = SYD_SetLogConfig("./Log", 6, 2);
if(ret != 0)
{
LOG("SYD_SetLogConfig ret=%08x", ret);
return 0;
}
ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, DEAL_TIMEOUT, 0, &hHandle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return 0;
}
ret = SYD_GetVersionInfo(hHandle, version, &version_len);
if(ret != 0)
{
LOG("SYD_GetVersionInfo ret=%08x", ret);
return 0;
}
printf("%s\n", version);
ret = SYD_DisConnect_Ex(hHandle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return 0;
}
/*
*
*160 :ZEK(00A) :80 :X :2
*
1:31313131313131313131313131313131
2:32323232323232323232323232323232
:03030303030303030303030303030303
*/
while (1)
{
LOG_MSG("/---功能测试---/");
LOG_MSG("0:连接正确性测试");
LOG_MSG("1:金交所业务场景1:循环多次(短连接-遍历所有功能-断开连接)");
LOG_MSG("2:金交所业务场景2:循环多次(连接池-遍历所有功能-断开连接)");
LOG_MSG("3:功能正确性测试");
LOG_MSG("4:吞吐量测试");
LOG_MSG("5:TPS性能测试");
LOG_MSG("6:稳定性测试");
LOG_MSG("100:退出");
LOG_MSG("请选择测试类型:");
scanf("%d", &mode);
switch (mode)
{
case 0:
connect_test();
break;
case 1:
short_connect_test();
break;
case 2:
threadpool_connect_test();
break;
case 3:
choose_cmd_test();
break;
case 4:
xn_throughput_test();
break;
case 5:
xn_cmd_tps();
break;
case 6:
stability_test();
break;
case 100:
return 0;
default:
LOG("mode not exist!");
break;
}
}
return 0;
}

1449
demo/demo_api.c Normal file

File diff suppressed because it is too large Load Diff

53
demo/demo_api.h Normal file
View File

@ -0,0 +1,53 @@
#ifndef _DEMO_API_H_
#define _DEMO_API_H_
#ifndef _DEMO_TYPEDEF_H_
#include "demo_typedef.h"
#endif
#ifndef _SUNYARD_H_
#include "sunyard.h"
#endif
#define DEV_IP "127.0.0.1"
#define DEV_PORT 8889
#define DEV2_IP "127.0.0.1"
#define DEV2_PORT 8889
#define CON_TIMEOUT 5000
#define DEAL_TIMEOUT 5000
#define KEYINDEX 0
#define CHECKINDEX 0
void IniOrgData(char *pcData, int iOrgDataLen, int k);
void PrintHex(const char* Title, unsigned char* Data, int DataLen);
void HexToBin(int iLen, unsigned char* pucInBuf, unsigned char* pucOutBuf);
void BinToHex(int iLen, unsigned char* pucInBuf, unsigned char* pucOutBuf);
int us_difftime(struct timeval start_time, struct timeval end_time);
int ms_difftime(struct timeval start_time, struct timeval end_time);
int SM4_ShortData_Test(void *hHandle);
int SM4_BatchData_Test(void *hHandle);
int SM4_LongData_Test(void *hHandle);
int SM4_LongData_Test_Special(void *hHandle);
int SM3_ShortHash_Test(void *hHandle);
int SM3_LongHash_Test(void *hHandle);
int SM3_LongHash_Test_Special(void *hHandle);
int SM4Mac_ShortData(void *hHandle);
int SM4Mac_BatchData(void *hHandle);
int SM4Mac_LongData(void *hHandle);
int SM4Mac_LongData_Special(void *hHandle);
int SM4_ShortData_CheckValue(void *hHandle);
int SM4_BatchData_CheckValue(void *hHandle);
int SM4_LongData_CheckValue(void *hHandle);
int XN_SM4_Enc_LongData_Test(void *hHandle, int datasize);
int XN_SM4_Dec_LongData_Test(void *hHandle, int datasize);
int XN_SM4Mac_LongData_Test(void *hHandle, int singlebytes);
int XN_SM3_LongHash_Test(void *hHandle, int singlebytes);
int XN_SM4EncMac_LongData_Test(void *hHandle, int datasize);
int XN_SM4DecMac_LongData_Test(void *hHandle, int datasize);
#endif

24
demo/demo_typedef.h Normal file
View File

@ -0,0 +1,24 @@
#ifndef _DEMO_TYPEDEF_H_
#define _DEMO_TYPEDEF_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/time.h>
#define API_DEBUG 1
#define API_DEBUG_ERR 1
#define LOG(format, ...) \
if (API_DEBUG) \
printf("[DEBUG|%s@%s,%d] " format "\n", \
__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_MSG(format, ...) \
if (API_DEBUG_ERR) \
printf("[DEBUG|%s@%s,%d] " format "\n", \
__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__)
#endif

462
demo/demo_xn.c Normal file
View File

@ -0,0 +1,462 @@
#define BATCH_MAX_SIZE 4
typedef struct
{
int cycle_num; /*<单线程循环次数>*/
int cmd; /*<命令码>*/
int data_len; /*<数据长度>*/
} trd_arg_t;
typedef struct
{
int keyidex[BATCH_MAX_SIZE];
int checkidex[BATCH_MAX_SIZE];
char sm4_short_encdata[1024 + 16];
int sm4_short_encdata_len;
char sm4_short_decdata[1024];
int sm4_short_decdata_len;
char sm4_short_checkvalue[33];
int sm4_short_checkvalue_len;
char sm4_batch_encdata[BATCH_MAX_SIZE][1024 + 16];
int sm4_batch_encdata_len[BATCH_MAX_SIZE];
char *tmp_sm4_batch_encdata[BATCH_MAX_SIZE];
char sm4_batch_decdata[BATCH_MAX_SIZE][1024];
int sm4_batch_decdata_len[BATCH_MAX_SIZE];
char *tmp_sm4_batch_decdata[BATCH_MAX_SIZE];
char sm4_batch_checkvalue[BATCH_MAX_SIZE][33];
int sm4_batch_checkvalue_len[BATCH_MAX_SIZE];
char *tmp_sm4_batch_checkvalue[BATCH_MAX_SIZE];
char sm4_batch_mac[BATCH_MAX_SIZE][33];
int sm4_batch_mac_len[BATCH_MAX_SIZE];
char *tmp_sm4_batch_mac[BATCH_MAX_SIZE];
char batch_orgdata[BATCH_MAX_SIZE][2048];
int batch_orgdata_len[BATCH_MAX_SIZE];
char *tmp_batch_orgdata[BATCH_MAX_SIZE];
char hash[33];
char mac[33];
int checkret[BATCH_MAX_SIZE];
} xn_init_config_t;
xn_init_config_t g_stc_xn_init_config;
static pthread_mutex_t g_time_mutex;
static int g_thread_count = 0;
static long g_all_time[300] = {0};
static long g_all_average_time[300] = {0};
static char g_org_data[9000] = {0};
long GetTime()
{
struct timeval t_time;
gettimeofday(&t_time,NULL);
return ((long)t_time.tv_sec) * 1000000 + ((long)t_time.tv_usec);
}
static int xn_tps_init_data(int data_len)
{
if(data_len <= 0 || data_len > 1024)
{
LOG("输入数据长度错误, 范围为[1, 1024]");
return -1;
}
int ret = 0, i = 0;
int check_ret[BATCH_MAX_SIZE] = {0};
void *handle = NULL;
const char *iplist[2] = {0};
int port[2] = {0};
iplist[0] = DEV_IP;
port[0] = DEV_PORT;
ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, DEAL_TIMEOUT, 0, &handle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return ret;
}
memset(&g_stc_xn_init_config, 0, sizeof(xn_init_config_t));
for(i = 0; i < BATCH_MAX_SIZE; i++)
{
g_stc_xn_init_config.keyidex[i] = KEYINDEX;
g_stc_xn_init_config.checkidex[i] = CHECKINDEX;
g_stc_xn_init_config.sm4_short_encdata_len = sizeof(g_stc_xn_init_config.sm4_short_encdata);
g_stc_xn_init_config.sm4_short_decdata_len = sizeof(g_stc_xn_init_config.sm4_short_decdata);
g_stc_xn_init_config.sm4_short_checkvalue_len = sizeof(g_stc_xn_init_config.sm4_short_checkvalue);
g_stc_xn_init_config.sm4_batch_encdata_len[i] = sizeof(g_stc_xn_init_config.sm4_batch_encdata[i]);
g_stc_xn_init_config.tmp_sm4_batch_encdata[i] = g_stc_xn_init_config.sm4_batch_encdata[i];
g_stc_xn_init_config.sm4_batch_decdata_len[i] = sizeof(g_stc_xn_init_config.sm4_batch_decdata[i]);
g_stc_xn_init_config.tmp_sm4_batch_decdata[i] = g_stc_xn_init_config.sm4_batch_decdata[i];
g_stc_xn_init_config.sm4_batch_checkvalue_len[i] = sizeof(g_stc_xn_init_config.sm4_batch_checkvalue[i]);
g_stc_xn_init_config.tmp_sm4_batch_checkvalue[i] = g_stc_xn_init_config.sm4_batch_checkvalue[i];
g_stc_xn_init_config.sm4_batch_mac_len[i] = sizeof(g_stc_xn_init_config.sm4_batch_mac[i]);
g_stc_xn_init_config.tmp_sm4_batch_mac[i] = g_stc_xn_init_config.sm4_batch_mac[i];
IniOrgData(g_stc_xn_init_config.batch_orgdata[i], 2048, 1);
g_stc_xn_init_config.batch_orgdata_len[i] = data_len;
g_stc_xn_init_config.tmp_batch_orgdata[i] = g_stc_xn_init_config.batch_orgdata[i];
}
ret = SYD_SM4_Encrypt_Mac_ShortData(handle, g_stc_xn_init_config.keyidex[0], g_stc_xn_init_config.checkidex[0], \
g_org_data, data_len, g_stc_xn_init_config.sm4_short_encdata, &g_stc_xn_init_config.sm4_short_encdata_len, \
g_stc_xn_init_config.sm4_short_checkvalue);
if(ret != 0)
{
LOG("SYD_SM4_Encrypt_Mac_ShortData ret=%08x", ret);
goto END;
}
g_stc_xn_init_config.sm4_short_checkvalue_len = 16;
ret = SYD_SM4_Encrypt_Mac_BatchData(handle, g_stc_xn_init_config.keyidex, g_stc_xn_init_config.checkidex, \
g_stc_xn_init_config.tmp_batch_orgdata, g_stc_xn_init_config.batch_orgdata_len, BATCH_MAX_SIZE, \
g_stc_xn_init_config.tmp_sm4_batch_encdata, g_stc_xn_init_config.sm4_batch_encdata_len, \
g_stc_xn_init_config.tmp_sm4_batch_checkvalue);
if(ret != 0)
{
LOG("SYD_SM4_Encrypt_Mac_BatchData ret=%08x", ret);
goto END;
}
g_stc_xn_init_config.sm4_short_checkvalue_len = 16;
END:
SYD_DisConnect_Ex(handle);
return ret;
}
static int xn_sm4_short_enc(void* handle, unsigned int data_len)
{
int ret = 0;
unsigned int sm4_short_encdata_len = sizeof(g_stc_xn_init_config.sm4_short_encdata);
ret = SYD_SM4_ShortData(handle, g_stc_xn_init_config.keyidex[0], g_org_data, data_len, \
SM4_ENCRYPT, g_stc_xn_init_config.sm4_short_encdata, &sm4_short_encdata_len);
if (ret != 0)
{
LOG("SYD_SM4_ShortData err ret=%08x", ret);
return ret;
}
return 0;
}
static int xn_sm4_short_dec(void* handle, unsigned int data_len)
{
int ret = 0;
unsigned int sm4_short_decdata_len = sizeof(g_stc_xn_init_config.sm4_short_decdata);
ret = SYD_SM4_ShortData(handle, g_stc_xn_init_config.keyidex[0], g_stc_xn_init_config.sm4_short_encdata, \
g_stc_xn_init_config.sm4_short_encdata_len, SM4_DECRYPT, g_stc_xn_init_config.sm4_short_decdata, \
&sm4_short_decdata_len);
if (ret != 0)
{
LOG("SYD_SM4_ShortData err ret=%08x", ret);
return ret;
}
return 0;
}
static int xn_sm4_short_mac(void* handle, unsigned int data_len)
{
int ret = 0;
ret = SYD_SM4Mac_ShortData(handle, g_stc_xn_init_config.keyidex[0], g_org_data, data_len, \
g_stc_xn_init_config.mac, NULL);
if(ret != 0)
{
LOG("SYD_SM4Mac_ShortData ret=%08x", ret);
return 0;
}
return 0;
}
static int xn_sm4_batch_mac(void* handle)
{
int ret = 0;
ret = SYD_SM4Mac_BatchData(handle, g_stc_xn_init_config.keyidex, g_stc_xn_init_config.tmp_batch_orgdata, \
g_stc_xn_init_config.batch_orgdata_len, BATCH_MAX_SIZE, g_stc_xn_init_config.tmp_sm4_batch_mac, NULL);
if(ret != 0)
{
LOG("SYD_SM4Mac_BatchData ret=%08x", ret);
return 0;
}
return 0;
}
static int xn_sm4_batch_enc(void* handle)
{
int ret = 0;
ret = SYD_SM4_BatchData(handle, g_stc_xn_init_config.keyidex, g_stc_xn_init_config.tmp_batch_orgdata, \
g_stc_xn_init_config.batch_orgdata_len, BATCH_MAX_SIZE, SM4_ENCRYPT, \
g_stc_xn_init_config.tmp_sm4_batch_encdata, g_stc_xn_init_config.sm4_batch_encdata_len);
if(ret != 0)
{
LOG("SYD_SM4_BatchData ret=%08x", ret);
return ret;
}
return 0;
}
static int xn_sm4_batch_dec(void* handle)
{
int ret = 0;
ret = SYD_SM4_BatchData(handle, g_stc_xn_init_config.keyidex, g_stc_xn_init_config.tmp_sm4_batch_encdata, \
g_stc_xn_init_config.sm4_batch_encdata_len, BATCH_MAX_SIZE, SM4_DECRYPT, \
g_stc_xn_init_config.tmp_sm4_batch_decdata, g_stc_xn_init_config.sm4_batch_decdata_len);
if(ret != 0)
{
LOG("SYD_SM4_BatchData ret=%08x", ret);
return ret;
}
return 0;
}
static int xn_sm3_short_data(void* handle, unsigned int data_len)
{
int ret = 0;
ret = SYD_SM3_Hash_ShortData(handle, g_org_data, data_len, g_stc_xn_init_config.hash);
if(ret != 0)
{
LOG("SYD_SM3_Hash_ShortData ret=%08x", ret);
return ret;
}
return 0;
}
static int xn_sm4_enc_short_checkvalue(void* handle, unsigned int data_len)
{
int ret = 0;
unsigned int sm4_short_encdata_len = sizeof(g_stc_xn_init_config.sm4_short_encdata);
ret = SYD_SM4_Encrypt_Mac_ShortData(handle, g_stc_xn_init_config.keyidex[0], g_stc_xn_init_config.checkidex[0], \
g_org_data, data_len, g_stc_xn_init_config.sm4_short_encdata, &sm4_short_encdata_len, g_stc_xn_init_config.mac);
if(ret != 0)
{
LOG("SYD_SM4_Encrypt_Mac_ShortData ret=%08x", ret);
return 0;
}
return 0;
}
static int xn_sm4_dec_short_checkvalue(void* handle)
{
int ret = 0;
unsigned int sm4_short_decdata_len = sizeof(g_stc_xn_init_config.sm4_short_decdata);
ret = SYD_SM4_Decrypt_Mac_ShortData(handle, g_stc_xn_init_config.keyidex[0], g_stc_xn_init_config.checkidex[0], \
g_stc_xn_init_config.sm4_short_encdata, g_stc_xn_init_config.sm4_short_encdata_len, g_stc_xn_init_config.sm4_short_checkvalue, \
g_stc_xn_init_config.sm4_short_decdata, &sm4_short_decdata_len);
if (ret != 0)
{
LOG("SYD_SM4_Decrypt_Mac_ShortData err ret=%08x", ret);
return ret;
}
return 0;
}
static int xn_sm4_batch_enc_checkvalue(void* handle)
{
int ret = 0;
ret = SYD_SM4_Encrypt_Mac_BatchData(handle, g_stc_xn_init_config.keyidex, g_stc_xn_init_config.checkidex, \
g_stc_xn_init_config.tmp_batch_orgdata, g_stc_xn_init_config.batch_orgdata_len, BATCH_MAX_SIZE, \
g_stc_xn_init_config.tmp_sm4_batch_encdata, g_stc_xn_init_config.sm4_batch_encdata_len, \
g_stc_xn_init_config.tmp_sm4_batch_checkvalue);
if (ret != 0)
{
LOG("SYD_SM4_Encrypt_Mac_BatchData err ret=%08x", ret);
return ret;
}
return 0;
}
static int xn_sm4_batch_dec_checkvalue(void* handle)
{
int ret = 0;
ret = SYD_SM4_Decrypt_Mac_BatchData(handle, g_stc_xn_init_config.keyidex, g_stc_xn_init_config.checkidex, \
g_stc_xn_init_config.tmp_sm4_batch_encdata, g_stc_xn_init_config.sm4_batch_encdata_len, \
g_stc_xn_init_config.tmp_sm4_batch_checkvalue, BATCH_MAX_SIZE, g_stc_xn_init_config.tmp_sm4_batch_decdata, \
g_stc_xn_init_config.sm4_batch_decdata_len, g_stc_xn_init_config.checkret);
if (ret != 0)
{
LOG("SYD_SM4_Decrypt_Mac_BatchData err ret=%08x", ret);
return ret;
}
return 0;
}
static int command_tps(void* handle, int cmd, int data_len)
{
int ret = 0;
switch(cmd)
{
case 0:
ret = xn_sm4_short_enc(handle, data_len);
break;
case 1:
ret = xn_sm4_short_dec(handle, data_len);
break;
case 2:
ret = xn_sm4_batch_enc(handle);
break;
case 3:
ret = xn_sm4_batch_dec(handle);
break;
case 4:
ret = xn_sm4_short_mac(handle, data_len);
break;
case 5:
ret = xn_sm4_batch_mac(handle);
break;
case 6:
ret = xn_sm3_short_data(handle, data_len);
break;
case 7:
ret = xn_sm4_enc_short_checkvalue(handle, data_len);
break;
case 8:
ret = xn_sm4_dec_short_checkvalue(handle);
break;
case 9:
ret = xn_sm4_batch_enc_checkvalue(handle);
break;
case 10:
ret = xn_sm4_batch_dec_checkvalue(handle);
break;
default:
break;
}
return 0;
}
void *xn_func_tps(void *arg)
{
int ret = 0, i = 0;
long begin = 0, end = 0;
trd_arg_t *trd_arg = (trd_arg_t *)arg;
void *conn_handle = NULL;
const char *iplist[5] = {0};
int port[5] = {0};
iplist[0] = DEV_IP;
port[0] = DEV_PORT;
ret = SYD_Connect_Ex(iplist, port, 1, CON_TIMEOUT, DEAL_TIMEOUT, 0, &conn_handle);
if(ret != 0)
{
LOG("SYD_Connect_Ex ret=%08x", ret);
return NULL;
}
begin = GetTime();
for (i = 0; i < trd_arg->cycle_num; i++)
{
ret = command_tps(conn_handle, trd_arg->cmd, trd_arg->data_len);
if (ret != 0) goto END;
}
end = GetTime() - begin;
LOG_MSG("笔数=%d|总用时:%ld(us)|单笔用时:%ld(us)", trd_arg->cycle_num, end, (end/trd_arg->cycle_num));
pthread_mutex_lock(&g_time_mutex);
printf("g_thread_count=%d\n", g_thread_count);
g_all_time[g_thread_count] = end;
g_all_average_time[g_thread_count] = (end/trd_arg->cycle_num);
g_thread_count++;
pthread_mutex_unlock(&g_time_mutex);
END:
if (ret == 0)
LOG_MSG("CMD:%d ok", trd_arg->cmd);
else
LOG_MSG("CMD:%d fail", trd_arg->cmd);
ret = SYD_DisConnect_Ex(conn_handle);
if(ret != 0)
{
LOG("SYD_DisConnect_Ex ret=%08x", ret);
return NULL;
}
return NULL;
}
int xn_cmd_tps()
{
int ret = 0;
float all_time = 0, all_average_time = 0, tps = 0;
int i = 0, cmd = 0;
long thread_count = 0, run_count = 0;
pthread_t pthid[1000];
trd_arg_t trd_arg;
memset(&trd_arg, 0, sizeof(trd_arg_t));
IniOrgData(g_org_data, 9000, 1);
pthread_mutex_init(&g_time_mutex, NULL);
while(1)
{
LOG_MSG("/-------性能测试TPS------/");
LOG_MSG("0:SM4短数据加密");
LOG_MSG("1:SM4短数据解密 ");
LOG_MSG("2:SM4批量加密 ");
LOG_MSG("3:SM4批量解密 ");
LOG_MSG("4:SM4-MAC短数据 ");
LOG_MSG("5:SM4-MAC批量数据 ");
LOG_MSG("6:SM3短数据");
LOG_MSG("7:SM4短数据加密&校验值");
LOG_MSG("8:SM4短数据解密&校验值");
LOG_MSG("9:SM4批量数据加密&校验值");
LOG_MSG("10:SM4批量数据解密&校验值");
LOG_MSG("100:退出");
LOG_MSG("请选择测试项:");
scanf("%d", &trd_arg.cmd);
if(trd_arg.cmd == 100) goto END;
LOG_MSG("请输入线程数:");
scanf("%ld", &thread_count);
LOG_MSG("请输入循环笔数:");
scanf("%ld", &run_count);
LOG_MSG("请输入数据长度:");
scanf("%d", &trd_arg.data_len);
trd_arg.cycle_num = run_count / thread_count;
g_thread_count = 0;
ret = xn_tps_init_data(trd_arg.data_len);
if(ret != 0)
{
LOG("xn_tps_init_data err");
goto END;
}
for (i = 0; i < thread_count; i++)
{
ret = pthread_create(&pthid[i], NULL, xn_func_tps, (void *)&trd_arg);
if(ret)
{
LOG("Fail to create thread %d", (int)pthid[i]);
goto END;
}
}
for (i = 0; i < thread_count; i++)
{
ret = pthread_join(pthid[i], NULL);
if(ret)
{
LOG("thread %d join failed\n", (int)pthid[i]);
goto END;
}
}
/*计算总时间*/
all_time = 0;
all_average_time = 0;
for(i = 0; i < g_thread_count; i++)
{
all_time += g_all_time[i];
all_average_time += g_all_average_time[i];
}
if(all_time == 0)
{
all_time = 1;
}
if(all_average_time == 0)
{
all_average_time = 1;
}
/*****平均时间*****/
tps = (run_count * 1000000) / (all_time / thread_count);
LOG_MSG("[指令:%d] [笔数:%ld] [线程数:%ld] [总用时:%f(us)] [TPS:%f] [平均延时:%f(ms)]", \
trd_arg.cmd, run_count, thread_count, (all_time / thread_count), tps, ((all_average_time / thread_count) / 1000));
}
END:
pthread_mutex_destroy(&g_time_mutex);
return 0;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

41
inc/error.h Normal file
View File

@ -0,0 +1,41 @@
#ifndef _ERROR_H_
#define _ERROR_H_
#define SYD_OK 0
#define SYD_FAIL 0x01000000
#define SYD_PARAM_ERR 0x01000001 //参数错误
#define SYD_POINT_ERR 0x01000002 //指针错误
#define SYD_MEMORY_ERR 0x01000003 //内存错误
#define SYD_DEVICE_NUM_ERR 0x01000004 //设备连接数错误
#define SYD_DEVICE_PORT_ERR 0x01000005 //设备端口错误
#define SYD_DEVICE_TIMEOUT_ERR 0x01000006 //设备超时错误
#define SYD_INVALIDHANDLE_ERR 0x01000007 //无效的句柄
#define SYD_OUTDATA_LEN_ERR 0x01000008 //输出缓冲区大小不足
#define SYD_QUEUE_HANDLE_ERR 0x01000009 //队列句柄未初始化
#define SYD_QUEUE_ISFULL 0x0100000A //队列已满
#define SYD_QUEUE_ISEMPTY 0x0100000B //队列为空
#define SYD_THREAD_CREATE_ERR 0x0100000C //线程创建失败
#define SYD_THREADPOOL_CLOSE 0x0100000D //线程池已关闭
#define SYD_THREADPOOL_HANDLE_ERROR 0x0100000E //线程句柄无效
#define SYD_THREAPOOL_DESTORY_OVERTIME 0x0100000F //线程销毁超时
#define SYD_MAC_CHECK_ERROR 0x01000010 //MAC校验错误
#define SYD_THREADPOOL_COUNT_ERROR 0x01000011 //线程数错误
#define SYD_HANDLE_TYPE_ERROR 0x01000012 //句柄类型错误
#define SYD_LONGDATA_HANDLE_UNINIT 0x01000013 //长数据的过程句柄没有执行初始化操作init, update, final 必须先执行init操作
#define SYD_DECRYPT_DATALEN_ERROR 0x01000014 //解密传入的数据长度错误不能为0且必须满足16的倍数
#define SYD_BATCH_DATA_SIZE_ERROR 0x01000015 //批量数据数组大小错误短连接最多只能支持4个长连接不限制
#define SYD_NET_CONNECT_ERR 0xFFFFFFFF //网络连接失败
#define SYD_NET_SEND_ERR 0xFFFFFFFE //网络发送失败
#define SYD_NET_RECV_ERR 0xFFFFFFFD //网络接收失败
#define SYD_NET_PARAM_ERR 0xFFFFFFFC //网络参数错误
#define SYD_NET_PKGLEN_ERR 0xFFFFFFFB //发送或接收的数据大小超过最大缓冲区大小
#define SYD_NET_CMD_ERR 0xFFFFFFFA //网络返回包命令码错误
#define SYD_NET_SN_ERR 0xFFFFFFF9 //网络返回包序列号错误
#define SYD_NET_OVERTIME 0xFFFFFFF8 //数据处理超时(可以将处理超时调大)
#define SYD_NET_NOBLOCK_EINTR 0xFFFFFFF7 //被信号中断,需要重试(非阻塞模式)
#define SYD_NET_NOBLOCK_EWOUDBLOCK_EAGAIN 0xFFFFFFF6 //send:TCP 窗口太小,数据暂时发不出去 recv:当前内核缓冲区中无可读数据 (非阻塞模式)
#define SYD_NET_NOBLOCK_CLOSE 0xFFFFFFF5 //对端关闭连接(非阻塞模式)
#endif

36
inc/log.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef _LOG_H_
#define _LOG_H_
#define LOG_MSG(A) Log_Two(__FILE__, __func__, __LINE__, A)
#define LOG_TWO(A, ...) Log_Two(__FILE__, __func__, __LINE__, A, __VA_ARGS__)
#define LOG(A, ...) Log_One(__FILE__, __func__, __LINE__, A, __VA_ARGS__)
#define LOG_NET(A, ...) Log_Net(__FILE__, __func__, __LINE__, A, __VA_ARGS__)
#define LOG_MAX_LINE 1024
#define LOG_MIN_LIN 256
#define LOG_CLOSE 0
#define LOG_OPEN 1
#define LOG_LEVEL_ONE 1
#define LOG_LEVEL_TWO 2
#define LOG_LEVEL_NET 3
typedef struct {
int iLogFlag;
int iLogLevel;
}STC_LOGINFO;
extern STC_LOGINFO g_stcLogInfo;
void Log_SetAttribute(int iLogFlag, int iLogLevel);
void Log_MutexInit();
void Log_MutexDestory();
void Log_Init(char *pcWorkPath);
void Log_One(const char* pcFile, const char* pcFunc, int iLine, char* pcLogBuf, ...);
void Log_Two(const char* pcFile, const char* pcFunc, int iLine, char* pcLogBuf, ...);
void Log_Net(const char* pcFile, const char* pcFunc, int iLine, char* pcLogBuf, ...);
void Log_Msg(char* pcLogBuf, ...);
void LOG_PrintHex(char* pcTitle, unsigned char* ucData, unsigned int uiDataLen);
#endif

55
inc/netapi.h Normal file
View File

@ -0,0 +1,55 @@
#ifndef _NETAPI_H_
#define _NETAPI_H_
#define IPMODE_IPV4 0
#define IPMODE_IPV6 1
int socket_connect(
const char *ip,
const int port,
const int timeout,
const int ipmode,
int *pSockfd);
int socket_send(
int fd,
char *buf,
int len);
int socket_recv(
int fd,
char *buf,
int len);
void socket_close(
int fd);
int socket_connect_noblock(
const char* ip,
const int port,
const int timeout,
const int ipmode,
int* pSockfd);
int socket_send_noblock(
int fd,
char *buf,
int len,
struct timeval start_time,
int deal_time);
int socket_recv_noblock(
int fd,
char *buf,
int len,
struct timeval start_time,
int deal_time);
void socket_close_noblock(
int fd);
int ms_difftime(
struct timeval start_time,
struct timeval end_time);
#endif

53
inc/public.h Normal file
View File

@ -0,0 +1,53 @@
#ifndef _PUBLIC_H_
#define _PUBLIC_H_
#define MIN_LIN 256
#define MAX_LIN 1024
/*动态库加载状态*/
#define P_DLL_INIT_OK 1
#define P_DLL_INIT_FAIL 0
/*连接池*/
#define P_THREADPOOL_MAX_COUNT 16
#define P_THREADPOOL_QUERY_MAX_COUNT 1000
#define P_THREADAPOOL_PKG_FLAG_OK 0x10001
#define P_THREADAPOOL_PKG_FLAG_FAIL 0x00000
/*句柄类型*/
#define P_HANDLE_DEV 0
#define P_HANDLE_SM4_ENCDEC 1
#define P_HANDLE_SM4_MAC 2
#define P_HANDLE_SM3_HASH 3
#define P_HANDLE_SM4_ENCDECMAC 4
#define P_HANDLE_NOTIFY 5
/*句柄有效性*/
#define P_HANDLE_OK 1
#define P_HANDLE_FAIL 0
/*错误码字节长度*/
#define P_ERR_LEN 2
/*主备机最大设备数*/
#define P_DEVICE_MAX_COUNT 16
/*批量调用流程*/
#define P_BATCH_ONLY_ONE 0
#define P_BATCH_ALL_PKG 1
/*批量分组个数*/
#define P_BATCH_GROUP 4
/*长数据分组初始化标志*/
#define P_DATA_INIT 1
#define P_DATA_FINAL 0
#define P_USEFLAG_THREADPOOL 1
#define P_USEFLAG_ORDINARY 0
void P_BinToHex(char* pcInBuf, int iInBufLen,char* pcOutBuf);
void P_HexToBin(char* pcInBuf, int iInBufLen,char* pcOutBuf);
int P_GetWorkPath(char *pcWorkPath);
#endif

39
inc/queue.h Normal file
View File

@ -0,0 +1,39 @@
#ifndef _QUEUE_H_
#define _QUEUE_H_
typedef struct
{
int* (*function)(void*, void*);
void *arg;
void *device;
}task_t;
typedef struct
{
task_t* task; //任务
int head; //队列头
int tail; //队列尾
int length; //队列长度
int capacity; //队列总容量
int status; //句柄状态
}queue_t;
/*初始化队列*/
queue_t* queue_init(int capacity);
/*销毁队列*/
void queue_destory(queue_t* queue);
/*清空队列*/
void queue_clear(queue_t* queue);
/*获取队列长度*/
int queue_getlength(queue_t* queue);
/*入队*/
int queue_enqueue(queue_t* queue, int* (*function)(void* arg, void *device), void *arg, void *device);
/*出队*/
int queue_dequeue(queue_t* queue, int* (*function)(void* arg, void *device), void *arg, void *device);
#endif

225
inc/sunyard.h Normal file
View File

@ -0,0 +1,225 @@
#ifndef _SUNYARD_H_
#define _SUNYARD_H_
#ifdef __cplusplus
extern "C"{
#endif
#if (defined(_WIN32) || defined(_WIN64)) && !defined(__WIN__)
#define __WIN__
#endif
#define DLL_EXPORT
#ifdef __WIN__
#ifdef DLL_EXPORT
#define DLL_DECLARE __declspec(dllexport)
#else
#define DLL_DECLARE __declspec(dllimport)
#endif
#define DEVAPI __stdcall
#else
#define DEVAPI
#define DLL_DECLARE __attribute__((visibility("default")))
#endif
/*log level*/
#define LOG_LEVEL_0 0
#define LOG_LEVEL_1 1
#define LOG_LEVEL_2 2
#define LOG_LEVEL_3 3
/*sm4 operate*/
#define SM4_ENCRYPT 1
#define SM4_DECRYPT 0
/*batch data package serial number*/
#define PKG_ONLY_ONE 0
#define PKG_FIRST 1
#define PKG_MIDDLE 2
#define PKG_LAST 3
DLL_DECLARE int DEVAPI SYD_SetLogConfig(
const char *pcLogPath,
int iLogPathLen,
int iLogLevel);
DLL_DECLARE int DEVAPI SYD_Connect_Ex(
const char *pcIpList[],
int iPortList[],
int iSize,
int iConnectTimeout,
int iDealTimeOut,
int iThreadCount,
void** phHandle);
DLL_DECLARE int DEVAPI SYD_DisConnect_Ex(
void* phHandle);
DLL_DECLARE int DEVAPI SYD_GetVersionInfo(
void* phHandle,
char* pcVersion,
int* piVersionLen);
DLL_DECLARE int DEVAPI SYD_SM4_ShortData(
void* phHandle,
int iKeyIndex,
char* pcData,
int iDataLen,
int iFlag,
char* pcOutData,
int* piOutDataLen);
DLL_DECLARE int DEVAPI SYD_SM4_BatchData(
void* phHandle,
int iKeyIndex[],
char* pcData[],
int iDataLen[],
int iSize,
int iFlag,
char* pcOutData[],
int iOutDataLen[]);
DLL_DECLARE int DEVAPI SYD_SM4_LongDataInit(
int iKeyIndex,
int iFlag,
void** phProcHandle);
DLL_DECLARE int DEVAPI SYD_SM4_LongDataUpdate(
void* phHandle,
char* pcData,
int iDataLen,
char* pcOutData,
int* piOutDataLen,
void* phProcHandle);
DLL_DECLARE int DEVAPI SYD_SM4_LongDataFinal(
void* phHandle,
char* pcOutData,
int* piOutDataLen,
void* phProcHandle);
DLL_DECLARE int DEVAPI SYD_SM3_Hash_ShortData(
void* phHandle,
char* pcData,
int iDataLen,
char* pcHash);
DLL_DECLARE int DEVAPI SYD_SM3_Hash_Init(
void** phHash);
DLL_DECLARE int DEVAPI SYD_SM3_Hash_Update(
void* phHandle,
char* pcData,
int iDataLen,
void* phHash);
DLL_DECLARE int DEVAPI SYD_SM3_Hash_Final(
void* phHandle,
char* pcHash,
void* phHash);
DLL_DECLARE int DEVAPI SYD_SM4Mac_ShortData(
void* phHandle,
int iKeyIndex,
char* pcData,
int iDataLen,
char* pcMac,
int* piCheckRet);
DLL_DECLARE int DEVAPI SYD_SM4Mac_BatchData(
void* phHandle,
int iKeyIndex[],
char* pcData[],
int iDataLen[],
int iSize,
char* pcMac[],
int piCheckRet[]);
DLL_DECLARE int DEVAPI SYD_SM4Mac_LongDataInit(
int iKeyIndex,
void** phMac);
DLL_DECLARE int DEVAPI SYD_SM4Mac_LongDataUpdate(
void* phHandle,
char* pcData,
int iDataLen,
void* phMac);
DLL_DECLARE int DEVAPI SYD_SM4Mac_LongDataFinal(
void* phHandle,
char* pcMac,
int* piCheckRet,
void* phMac);
DLL_DECLARE int DEVAPI SYD_CloseHandle(
void *hHandle);
DLL_DECLARE int DEVAPI SYD_SM4_Encrypt_Mac_ShortData(
void* phHandle,
int iEncKeyIndex,
int iCheckKeyIndex,
char* pcData,
int iDataLen,
char* pcEncData,
int* piEncDataLen,
char* pcMac);
DLL_DECLARE int DEVAPI SYD_SM4_Decrypt_Mac_ShortData(
void* phHandle,
int iEncKeyIndex,
int iCheckKeyIndex,
char* pcEncData,
int iEncDataLen,
char* pcMac,
char* pcOutData,
int* piOutDataLen);
DLL_DECLARE int DEVAPI SYD_SM4_Encrypt_Mac_BatchData(
void* phHandle,
int iEncKeyIndex[],
int iCheckKeyIndex[],
char* pcData[],
int iDataLen[],
int iSize,
char* pcEncData[],
int iEncDataLen[],
char* pcMac[]);
DLL_DECLARE int DEVAPI SYD_SM4_Decrypt_Mac_BatchData(
void* phHandle,
int iEncKeyIndex[],
int iCheckKeyIndex[],
char* pcEncData[],
int iEncDataLen[],
char* pcMac[],
int iSize,
char* pcOutData[],
int iOutDataLen[],
int iCheckRet[]);
DLL_DECLARE int DEVAPI SYD_SM4EncDecMac_LongDataInit(
int iEncKeyIndex,
int iCheckKeyIndex,
int iFlag,
void** phProcHandle);
DLL_DECLARE int DEVAPI SYD_SM4EncDecMac_LongDataUpdate(
void* phHandle,
char* pcData,
int iDataLen,
char* pcOutData,
int* piOutDataLen,
void* phProcHandle);
DLL_DECLARE int DEVAPI SYD_SM4EncDecMac_LongDataFinal(
void* phHandle,
char* pcOutData,
int* piOutDataLen,
char* pcMac,
void* phProcHandle);
#ifdef __cplusplus
}
#endif
#endif

215
inc/sunyard_d.h Normal file
View File

@ -0,0 +1,215 @@
#ifndef _SUNYARD_D_H_
#define _SUNYARD_D_H_
#ifndef _SUNYARD_H_
#include "sunyard.h"
#endif
#ifndef _PUBLIC_H_
#include "public.h"
#endif
#ifndef _THREAD_POOL_H_
#include "threadpool.h"
#endif
typedef struct {
int socket_fd;
char ip[40];
int port;
int con_timeout;
int deal_timeout;
int status;
} STC_CONNECT_INFO;
typedef struct {
threadpool_t *threadpool; /*连接池*/
pthread_mutex_t threadpool_mutex; /*连接池锁*/
int threadpool_deal_time; /*连接池处理时间*/
STC_CONNECT_INFO connect_info[P_DEVICE_MAX_COUNT]; /*普通连接信息*/
int connect_idex; /*当前使用机器序号*/
int connect_count; /*机器连接个数*/
int deal_time; /*普通连接处理时间*/
int connect_timeout; /*设备连接时间*/
int use_flag; /*使用标志0使用普通连接 1使用线程池*/
int status; /*句柄有效性*/
}STC_DEVICE_INFO;
typedef struct {
int keyidex; /*密钥索引*/
int flag; /*加解密标识*/
char procdata[64]; /*加密过渡数据*/
int procdatalen; /*加密过渡数据长度*/
int initflag; /*初始化标志*/
int status; /*句柄有效性*/
}STC_SM4_ENCDEC_INFO;
typedef struct {
int keyidex; /*密钥索引*/
char iv[64]; /*过程IV*/
int ivlen; /*过程IV长度*/
char procdata[64]; /*过渡数据*/
int procdatalen; /*过渡数据长度*/
int initflag; /*初始化标志*/
int status; /*句柄有效性*/
}STC_SM4_MAC_INFO;
typedef struct {
char procdata[MAX_LIN]; /*过渡数据*/
int procdatalen; /*过渡数据长度*/
int firstflag; /*第一包标志*/
int initflag; /*初始化标志*/
int status; /*句柄有效性*/
}STC_SM3_HASH_INFO;
typedef struct {
STC_SM4_ENCDEC_INFO sm4_encdec_info;
STC_SM4_MAC_INFO sm4_mac_info;
int initflag; /*初始化标志*/
int status; /*句柄有效性*/
}STC_SM4_ENCDECMAC_INFO;
typedef struct {
STC_DEVICE_INFO *device_info;
STC_SM4_ENCDEC_INFO *sm4_encdec_info;
STC_SM4_MAC_INFO *sm4_mac_info;
STC_SM3_HASH_INFO *sm3_hash_info;
STC_SM4_ENCDECMAC_INFO *sm4_encdecmac_info;
int iHandleType;
int iStatus;
}STC_D_HANDLE;
int SYD_D_AnalysisDevHandle(
void* handle,
int handletype,
void** outhandle);
int SYD_D_Connect_Ex(
const char *pcIpList[],
int iPortList[],
int iSize,
int iConnectTimeout,
int iDealTimeOut,
int iThreadCount,
void** phHandle);
int SYD_D_DisConnect_Ex(
void* phHandle);
int SYD_D_GetServerVersion(
void* phHandle,
char* pcServerVersion,
int* piServerVersionLen);
int SYD_D_SM4_ShortData(
void* phHandle,
int iKeyIndex,
char* pcData,
int iDataLen,
int iFlag,
char* pcOutData,
int* piOutDataLen);
int SYD_D_SM4_LongData(
void* phHandle,
int iKeyIndex,
char* pcData,
int iDataLen,
int iPkgNum,
int iFlag,
char* pcOutData,
int* piOutDataLen);
int SYD_D_SM4_Data(
void* phHandle,
int iKeyIndex[],
char *pcData[],
int iDataLen[],
int iSize,
int iFlag,
char *pcOutData[],
int iOutDataLen[]);
int SYD_D_SM4_BatchData(
void* phHandle,
int iKeyIndex[],
char *pcData[],
int iDataLen[],
int iSize,
int iFlag,
char *pcOutData[],
int iOutDataLen[],
int iCheckRet[]);
int SYD_D_SM3_Hash_ShortData(
void* phHandle,
char* pcData,
int iDataLen,
char* pcHash);
int SYD_D_SM3_Hash_LongData(
void* phHandle,
char* pcData,
int iDataLen,
int iPkgNum,
char* pcProcData,
int* piProcDataLen,
char* pcHash);
int SYD_D_SM4Mac_ShortData(
void* phHandle,
int iKeyIndex,
char* pcData,
int iDataLen,
char* pcMac,
int* piCheckRet);
int SYD_D_SM4Mac_BatchData(
void* phHandle,
int iKeyIndex[],
char* pcData[],
int iDataLen[],
int iSize,
char* pcMac[],
int piCheckRet[]);
int SYD_D_SM4Mac_LongData(
void* phHandle,
int iKeyIndex,
char* pcData,
int iDataLen,
int iPkgNum,
char* pcProcData,
int* piProcDataLen,
char* pcMac,
int* piCheckRet);
int SYD_D_CloseHandle(
void *handle);
int SYD_D_SM4_ShortData_CheckValue(
void* phHandle,
int iEncKeyIndex,
int iCheckKeyIndex,
char* pcData,
int iDataLen,
char* pcMac,
int iFlag,
char* pcOutData,
int* piOutDataLen,
char* pcOutMac);
int SYD_D_SM4_BatchData_CheckValue(
void* phHandle,
int iEncKeyIndex[],
int iCheckKeyIndex[],
char* pcData[],
int iDataLen[],
char* pcMac[],
int iSize,
int iFlag,
char* pcOutData[],
int iOutDataLen[],
char* pcOutMac[]);
#endif

103
inc/threadpool.h Normal file
View File

@ -0,0 +1,103 @@
#ifndef _THREAD_POOL_H_
#define _THREAD_POOL_H_
#ifndef _TYPEDEF_H_
#include "typedef.h"
#endif
#ifndef _PUBLIC_H_
#include "public.h"
#endif
#ifndef _QUEUE_H_
#include "queue.h"
#endif
typedef struct {
int socket_fd;
char ip[40];
int port;
int con_timeout;
int deal_timeout;
int status;
} threadpool_connect_info_t;
typedef struct {
pthread_t thread_id;
queue_t* work_queue;
threadpool_connect_info_t connect_info[P_DEVICE_MAX_COUNT];
int connect_count;
int connect_idex;
} threadpool_task_t;
typedef struct {
threadpool_task_t* work_threads; /* 工作线程 */
/*管理线程*/
threadpool_task_t* admin_threads; /* 管理线程 */
pthread_t admin_thread_id; /* 管理线程ID */
/*线程池信息*/
int total_thr_num; /* 线程总数 */
int live_thr_num; /* 线程池中存活的线程数 */
int busy_thr_num; /* 忙线程,正在工作的线程 */
unsigned long long task_num; /* 已执行的所有任务量统计值(不包含正在执行中的任务) */
/*任务队列信息*/
queue_t* queue[64];
int queue_max_size; /* 队列能容纳的最大任务数 */
pthread_mutex_t queue_mutex; /* 多个工作线程创建队列时加锁 */
int free_queue;
/*线程池状态*/
int shutdown; /* 线程池开关: FALSE: 开启 TRUE: 关闭 */
} threadpool_t;
/*
线-*
queue_max_size是一个工作线程的队列容量
*/
threadpool_t* threadpool_create(int thread_num, int queue_max_size);
/*
-
使线threadpool_destroy使
*/
int threadpool_add_task(threadpool_t *threadpool, int* (*function)(void* arg, void* device), void* arg, void* device);
/*
线
使threadpool_add_task使
*/
int threadpool_destroy(threadpool_t *threadpool);
/*创建线程池中设备连接*/
int threadpool_create_connect(
threadpool_t *threadpool,
const char *pcIpList[],
int iPortList[],
int dev_num,
int iConnectTimeout);
/*断开线程池中的所有设备连接*/
int threadpool_disconnect(threadpool_t *threadpool);
/*设置线程池中的连接信息*/
int threadpool_set_connect_info(
threadpool_t *threadpool,
const char *pcIpList[],
int iPortList[],
int dev_num,
int iConnectTimeout,
int iDealTimeOut);
/*清除线程池中的连接信息*/
int threadpool_clear_connect_info(threadpool_t *threadpool);
/*主备机监控恢复线程*/
int threadpool_device_admin(threadpool_t *threadpool);
#endif

48
inc/trans.h Normal file
View File

@ -0,0 +1,48 @@
#ifndef _TRANS_H_
#define _TRANS_H_
#ifndef _THREADPOOL_H_
#include "threadpool.h"
#endif
typedef struct
{
unsigned char LENGTH[2];
unsigned char HEADER[8];
unsigned char COMMAND[2];
unsigned char data[8192];
} TRD_PKG_ST;
typedef struct
{
TRD_PKG_ST send_pkg_st;
TRD_PKG_ST recv_pkg_st;
char cmd[3];
int deal_time;
int task_ret;
int task_flag;
int connect_idex;
} TRD_PKG_THREADPOOL_ST;
int Get_retcode(TRD_PKG_ST *pkg);
unsigned int Get_sn(TRD_PKG_ST *pkg);
char *Get_cmd(TRD_PKG_ST *pkg);
int Get_length(TRD_PKG_ST *pkg);
void Set_sn(TRD_PKG_ST *pkg, unsigned int sn);
void Set_cmd(TRD_PKG_ST *pkg, char *cmd);
void Set_length(TRD_PKG_ST *pkg, int length);
int Packet_Recv(int fd, TRD_PKG_ST *pkg, int pkgsize);
int Packet_Send(int fd, TRD_PKG_ST *pkg, int pkgsize);
void SetDataLength(int iInData, unsigned char* pcOutData);
int GetDataLength(unsigned char* pcInData);
/*非阻塞-线程回调-主备模式*/
int TP_Process_NoBlock_Standby(char *cmd, TRD_PKG_ST *send_pkg, TRD_PKG_ST *recv_pkg, void *device, int deal_time);
/*非阻塞-非线程回调-主备模式*/
int TP_Process_NoBlock_Ordinary(char *cmd, TRD_PKG_ST *send_pkg, TRD_PKG_ST *recv_pkg, STC_CONNECT_INFO *connect_info, int *connect_idex, int device_count, int deal_time);
int TP_Process_NoBlock(threadpool_t *threadpool, pthread_mutex_t *threadpool_mutex, TRD_PKG_THREADPOOL_ST *pkg_threadpool_st, int pkg_number);
#endif

51
inc/typedef.h Normal file
View File

@ -0,0 +1,51 @@
#ifndef _TYPEDEF_H_
#define _TYPEDEF_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/time.h>
#include <pthread.h>
#include <stdarg.h>
#include <errno.h>
#include <time.h>
#ifndef _ERROR_H_
#include "error.h"
#endif
/* 内存访问栅 */
#define barrier() (__sync_synchronize())
/*原子设置,如果原值和新值不一样则设置*/
#define AO_SET(ptr, value) ((void)__sync_lock_test_and_set((ptr), (value)))
/*原子获取*/
#define AO_GET(ptr) ({ __typeof__(*(ptr)) volatile *_val = (ptr); barrier(); (*_val); })
/*原子加*/
#define AO_F_ADD(ptr, value) ((__typeof__(*(ptr)))__sync_fetch_and_add((ptr), (value)))
/*原子减*/
#define AO_F_SUB(ptr, value) ((__typeof__(*(ptr)))__sync_fetch_and_sub((ptr), (value)))
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#endif

7
run.sh Normal file
View File

@ -0,0 +1,7 @@
cd src/
make clean all
cd ../demo
make clean all
cd ..
export LD_LRBRARY_PATH=./lib

65
src/Makefile Normal file
View File

@ -0,0 +1,65 @@
# SlickEdit generated file. Do not edit this file except in designated areas.
# Make command to use for dependencies
MAKE=make
RM=rm
MKDIR=mkdir
# SlickEdit generated file. Do not edit this file except in designated areas.
# Make command to use for dependencies
MAKE=make
RM=rm
MKDIR=mkdir
# -----Begin user-editable area-----
# -----End user-editable area-----
# If no configuration is specified, "Debug" will be used
ifndef CFG
CFG=Debug
endif
#
# Configuration: Debug
#
ifeq "$(CFG)" "Debug"
OUTDIR=Debug
OUTFILE=../lib/libsunyard.so
CFG_INC=-I../inc
CFG_LIB=-lpthread
CFG_OBJ=
COMMON_OBJ=$(OUTDIR)/netapi.o $(OUTDIR)/trans.o $(OUTDIR)/log.o $(OUTDIR)/public.o $(OUTDIR)/sunyard.o $(OUTDIR)/sunyard_d.o \
$(OUTDIR)/queue.o $(OUTDIR)/threadpool.o
OBJ=$(COMMON_OBJ) $(CFG_OBJ)
ALL_OBJ=$(OUTDIR)/netapi.o $(OUTDIR)/trans.o $(OUTDIR)/log.o $(OUTDIR)/public.o $(OUTDIR)/sunyard.o $(OUTDIR)/sunyard_d.o \
$(OUTDIR)/queue.o $(OUTDIR)/threadpool.o
COMPILE=gcc -c "-D_REENTRANT" -g -fPIC -fvisibility=hidden -o "$(OUTDIR)/$(*F).o" $(CFG_INC) $<
LINK=gcc -g -shared -fPIC -fvisibility=hidden -L../lib -o "$(OUTFILE)" $(ALL_OBJ) $(CFG_LIB)
# Pattern rules
$(OUTDIR)/%.o : %.c
$(COMPILE)
# Build rules
all: $(OUTFILE)
$(OUTFILE): $(OUTDIR) $(OBJ)
$(LINK)
$(OUTDIR):
$(MKDIR) -p "$(OUTDIR)"
# Rebuild this project
rebuild: cleanall all
# Clean this project
clean:
$(RM) -f $(OUTFILE)
$(RM) -f $(OBJ)
# Clean this project and all dependencies
cleanall: clean
endif

298
src/log.c Normal file
View File

@ -0,0 +1,298 @@
#ifndef _TYPEDEF_H_
#include "typedef.h"
#endif
#ifndef _LOG_H_
#include "log.h"
#endif
static pthread_mutex_t g_apilogmutex;
static unsigned char g_stcApiLogPath[LOG_MAX_LINE] = { 0 };
STC_LOGINFO g_stcLogInfo;
static void GetDateTime(unsigned char *pucDate, unsigned char *pucDateTime)
{
long ts;
struct tm *ptm;
ts = time(NULL);
ptm = localtime(&ts);
if(pucDate != NULL)
{
sprintf((char *)pucDate, "%04d-%02d-%02d", \
ptm->tm_year + 1900, ptm-> tm_mon + 1, ptm->tm_mday);
}
if(pucDateTime != NULL)
{
sprintf((char *)pucDateTime, "%04d-%02d-%02d %02d:%02d:%02d", \
ptm->tm_year + 1900, ptm-> tm_mon + 1, ptm->tm_mday, ptm-> tm_hour, ptm-> tm_min, ptm-> tm_sec);
}
}
static int CheckFileExit(char *pcFilePath)
{
if(access(pcFilePath, F_OK) != 0)
{
return SYD_FAIL;
}
return SYD_OK;
}
void Log_SetAttribute(int iLogFlag, int iLogLevel)
{
g_stcLogInfo.iLogFlag = iLogFlag;
g_stcLogInfo.iLogLevel = iLogLevel;
}
void Log_MutexInit()
{
pthread_mutex_init(&g_apilogmutex, NULL);
}
void Log_MutexDestory()
{
pthread_mutex_destroy(&g_apilogmutex);
}
static void Mkdir(char *pcDir)
{
int iIndex = 1;
char *tmp = (char *)pcDir;
while(iIndex < strlen(pcDir) + 1)
{
if(*(pcDir + iIndex) == '/' || *(pcDir + iIndex) == '\0')
{
char cParent[LOG_MIN_LIN] = {0};
strncpy(cParent, pcDir, iIndex);
if(0 != access(cParent, 6))
{
mkdir(cParent, 0755);
}
}
iIndex++;
}
}
static unsigned int Touch(char *pcFile)
{
FILE* fp = NULL;
fp = fopen(pcFile, "w+");
if (fp == NULL)
{
return SYD_FAIL;
}
fclose(fp);
return SYD_OK;
}
void Log_Init(char *pcWorkPath)
{
int iRet = 0;
char cCmd[LOG_MAX_LINE] = {0};
memset(g_stcApiLogPath, 0, sizeof(g_stcApiLogPath));
sprintf(g_stcApiLogPath, "%s/SydLog", pcWorkPath);
iRet = CheckFileExit(g_stcApiLogPath);
if(iRet != SYD_OK)
{
Mkdir(g_stcApiLogPath);
}
}
void Log_Net(const char* pcFile, const char* pcFunc, int iLine, char* pcLogBuf, ...)
{
if (g_stcLogInfo.iLogFlag != LOG_OPEN)
{
return;
}
int iRet = 0;
unsigned char bDateTime[LOG_MAX_LINE] = {0};
unsigned char bDate[LOG_MAX_LINE] = {0};
char cLogBuf[8192] = {0};
char cLogPath[LOG_MAX_LINE] = {0};
char cCmd[LOG_MAX_LINE] = {0};
GetDateTime(bDate, bDateTime);
pthread_mutex_lock(&g_apilogmutex);
sprintf(cLogPath, "%s/%s[%d].txt", g_stcApiLogPath, bDate, getpid());
iRet = CheckFileExit(cLogPath);
if(iRet != 0)
{
Touch(cLogPath);
}
va_list ap;
va_start(ap, pcLogBuf);
vsnprintf(cLogBuf, 8192, pcLogBuf, ap);
va_end(ap);
FILE *fp = NULL;
fp = fopen((char *)cLogPath, "a");
if (fp == NULL)
{
pthread_mutex_unlock(&g_apilogmutex);
return;
}
fprintf(fp, "[thread_id:%ld][%s][%s][%s]:%d %s\n", pthread_self(), bDateTime, pcFile, pcFunc, iLine, cLogBuf);
fflush(fp);
fclose(fp);
pthread_mutex_unlock(&g_apilogmutex);
}
void Log_One(const char* pcFile, const char* pcFunc, int iLine, char* pcLogBuf, ...)
{
if (g_stcLogInfo.iLogFlag != LOG_OPEN)
{
return;
}
int iRet = 0;
unsigned char bDateTime[LOG_MAX_LINE] = {0};
unsigned char bDate[LOG_MAX_LINE] = {0};
char cLogBuf[8192] = {0};
char cLogPath[LOG_MAX_LINE] = {0};
char cCmd[LOG_MAX_LINE] = {0};
GetDateTime(bDate, bDateTime);
pthread_mutex_lock(&g_apilogmutex);
sprintf(cLogPath, "%s/%s[%d].txt", g_stcApiLogPath, bDate, getpid());
iRet = CheckFileExit(cLogPath);
if(iRet != 0)
{
Touch(cLogPath);
}
va_list ap;
va_start(ap, pcLogBuf);
vsnprintf(cLogBuf, 8192, pcLogBuf, ap);
va_end(ap);
FILE *fp = NULL;
fp = fopen((char *)cLogPath, "a");
if (fp == NULL)
{
pthread_mutex_unlock(&g_apilogmutex);
return;
}
fprintf(fp, "[thread_id:%ld][%s][%s][%s]:%d %s\n", pthread_self(), bDateTime, pcFile, pcFunc, iLine, cLogBuf);
fflush(fp);
fclose(fp);
pthread_mutex_unlock(&g_apilogmutex);
}
void Log_Two(const char* pcFile, const char* pcFunc, int iLine, char* pcLogBuf, ...)
{
if (g_stcLogInfo.iLogFlag != LOG_OPEN || g_stcLogInfo.iLogLevel != LOG_LEVEL_TWO)
{
return;
}
int iRet = 0;
unsigned char bDateTime[LOG_MAX_LINE] = {0};
unsigned char bDate[LOG_MAX_LINE] = {0};
char cLogBuf[8192] = {0};
char cLogPath[LOG_MAX_LINE] = {0};
char cCmd[LOG_MAX_LINE] = {0};
GetDateTime(bDate, bDateTime);
pthread_mutex_lock(&g_apilogmutex);
sprintf(cLogPath, "%s/%s[%d].txt", g_stcApiLogPath, bDate, getpid());
iRet = CheckFileExit(cLogPath);
if(iRet != 0)
{
Touch(cLogPath);
}
va_list ap;
va_start(ap, pcLogBuf);
vsnprintf(cLogBuf, 8192, pcLogBuf, ap);
va_end(ap);
FILE *fp = NULL;
fp = fopen((char *)cLogPath, "a");
if (fp == NULL)
{
pthread_mutex_unlock(&g_apilogmutex);
return;
}
fprintf(fp, "[thread_id:%ld][%s][%s][%s]:%d %s\n", pthread_self(), bDateTime, pcFile, pcFunc, iLine, cLogBuf);
fflush(fp);
fclose(fp);
pthread_mutex_unlock(&g_apilogmutex);
}
void Log_Msg(char* pcLogBuf, ...)
{
if (g_stcLogInfo.iLogFlag != LOG_OPEN || g_stcLogInfo.iLogLevel != LOG_LEVEL_TWO)
{
return;
}
int iRet = 0;
unsigned char bDateTime[LOG_MAX_LINE] = {0};
unsigned char bDate[LOG_MAX_LINE] = {0};
char cLogBuf[8192] = {0};
char cLogPath[LOG_MAX_LINE] = {0};
char cCmd[LOG_MAX_LINE] = {0};
GetDateTime(bDate, bDateTime);
pthread_mutex_lock(&g_apilogmutex);
sprintf(cLogPath, "%s/%s[%d].txt", g_stcApiLogPath, bDate, getpid());
iRet = CheckFileExit(cLogPath);
if(iRet != 0)
{
Touch(cLogPath);
}
va_list ap;
va_start(ap, pcLogBuf);
vsnprintf(cLogBuf, 8192, pcLogBuf, ap);
va_end(ap);
FILE *fp = NULL;
fp = fopen((char *)cLogPath, "a");
if (fp == NULL)
{
pthread_mutex_unlock(&g_apilogmutex);
return;
}
fprintf(fp, "%s\n", cLogBuf);
fflush(fp);
fclose(fp);
pthread_mutex_unlock(&g_apilogmutex);
}
void LOG_PrintHex(char* pcTitle, unsigned char* ucData, unsigned int uiDataLen)
{
if (g_stcLogInfo.iLogFlag != LOG_OPEN || g_stcLogInfo.iLogLevel != LOG_LEVEL_TWO)
{
return;
}
if (ucData == NULL || uiDataLen == 0)
{
return;
}
unsigned int i = 0;
char cTmp[8000] = { 0 };
char cBuf[10] = { 0 };
LOG_TWO("\n[%s][len=%d]:", pcTitle, uiDataLen);
for (i = 0; i < uiDataLen; i++)
{
if (!(i % 16))
{
strcat(cTmp, "\n");
}
sprintf(cBuf, " %02X", ucData[i]);
strcat(cTmp, cBuf);
if ((i % 256 == 0) && (i / 256 > 0))
{
Log_Msg("%s", cTmp);
memset(cTmp, 0, sizeof(cTmp));
}
}
Log_Msg("%s\n", cTmp);
}

431
src/netapi.c Normal file
View File

@ -0,0 +1,431 @@
#ifndef _TYPEDEF_H_
#include "typedef.h"
#endif
#ifndef _NETAPI_H_
#include "netapi.h"
#endif
#ifndef _LOG_H_
#include "log.h"
#endif
void socket_set_timeout(int sockfd, int second)
{
struct timeval tv;
tv.tv_sec = second / 1000;
tv.tv_usec = (second % 1000) * 1000;
setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (char*)&tv, sizeof(struct timeval));
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(struct timeval));
}
int socket_connect_ipv4(const char* ip, const int port, const int timeout, int* pSockfd)
{
if (ip == NULL || port > 65535 || port < 1024 || pSockfd == NULL)
{
return -1;
}
int fd = 0, ret = -1;
struct sockaddr_in servaddr;
int iSockLen = sizeof(servaddr);
fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0)
{
return -1;
}
memset(&servaddr, 0, iSockLen);
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr(ip);
servaddr.sin_port = htons(port);
socket_set_timeout(fd, timeout);
ret = connect(fd, (struct sockaddr *)&servaddr, iSockLen);
if (ret < 0)
{
if(errno==ETIMEDOUT)
{
return -3;
}
return -1;
}
*pSockfd = fd;
return 0;
}
int socket_connect_ipv6(const char* ip, const int port, const int timeout, int* pSockfd)
{
if (ip == NULL || port > 65535 || port < 1024 || pSockfd == NULL)
{
return -1;
}
int fd = 0, ret = -1;
struct sockaddr_in6 servaddr;
int iSockLen = sizeof(servaddr);
fd = socket(AF_INET6, SOCK_STREAM, 0);
if (fd < 0)
{
return -1;
}
memset(&servaddr, 0, iSockLen);
servaddr.sin6_family = AF_INET6;
inet_pton(AF_INET6, ip, &servaddr.sin6_addr);
servaddr.sin6_port = htons(port);
socket_set_timeout(fd, timeout);
ret = connect(fd, (struct sockaddr *)&servaddr, iSockLen);
if (ret<0)
{
if(errno==ETIMEDOUT)
{
return -3;
}
return -1;
}
*pSockfd = fd;
return 0;
}
int socket_connect(const char* ip, const int port, const int timeout, const int ipmode, int* pSockfd)
{
int ret = 0;
switch (ipmode)
{
case IPMODE_IPV4:
ret = socket_connect_ipv4(ip, port, timeout, pSockfd);
break;
case IPMODE_IPV6:
ret = socket_connect_ipv6(ip, port, timeout, pSockfd);
break;
default:
return SYD_NET_CONNECT_ERR;
}
return ret;
}
int socket_send(int fd, char* buf, int len)
{
if (NULL == buf || len < 0)
{
return SYD_NET_PARAM_ERR;
}
int ret = 0, total = 0;
while (total < len)
{
ret = send(fd, buf + total, len - total, MSG_NOSIGNAL);
if (ret <= 0)
{
return SYD_NET_SEND_ERR;
}
total += ret;
}
return 0;
}
int socket_recv(int fd, char* buf, int len)
{
if (NULL == buf || len < 0)
{
return SYD_NET_PARAM_ERR;
}
int ret = 0, total = 0;
while (total < len)
{
ret = recv(fd, buf + total, len - total, MSG_NOSIGNAL);
if (ret <= 0)
{
return SYD_NET_RECV_ERR;
}
total += ret;
}
return 0;
}
void socket_close(int fd)
{
close(fd);
}
int socket_connect_ipv4_noblock(const char* ip, const int port, const int timeout, int* pSockfd)
{
if (ip == NULL || port > 65535 || port < 1024 || pSockfd == NULL)
{
return -1;
}
int fd = 0, ret = -1, flags = 0;
int len = 0, error = 0;
struct sockaddr_in servaddr;
int iSockLen = sizeof(servaddr);
fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0)
{
return -1;
}
memset(&servaddr, 0, iSockLen);
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr(ip);
servaddr.sin_port = htons(port);
flags = fcntl(fd, F_GETFL, 0);
if (flags == -1)
{
close(fd);
return -1;
}
flags |= O_NONBLOCK;
if (fcntl(fd, F_SETFL, flags) == -1)
{
close(fd);
return -1;
}
ret = connect(fd, (struct sockaddr *)&servaddr, iSockLen);
if (ret < 0)
{
if(errno != EINPROGRESS)
{
close(fd);
return -1;
}
struct timeval tv;
fd_set wset;
tv.tv_sec = timeout/1000;
tv.tv_usec = (timeout % 1000) * 1000;
FD_ZERO(&wset);
FD_SET(fd, &wset);
int n = select(fd + 1, NULL, &wset, NULL, &tv);
if (n <= 0)
{
close(fd);
return -1;
}
len = sizeof(error);
getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len);
if(error)
{
close(fd);
return -1;
}
}
*pSockfd = fd;
return 0;
}
int socket_connect_ipv6_noblock(const char* ip, const int port, const int timeout, int* pSockfd)
{
if (ip == NULL || port > 65535 || port < 1024 || pSockfd == NULL)
{
return -1;
}
int fd = 0, ret = -1, flags = 0;
int len = 0, error = 0;
struct sockaddr_in6 servaddr;
int iSockLen = sizeof(servaddr);
fd = socket(AF_INET6, SOCK_STREAM, 0);
if (fd < 0)
{
return -1;
}
memset(&servaddr, 0, iSockLen);
servaddr.sin6_family = AF_INET6;
inet_pton(AF_INET6, ip, &servaddr.sin6_addr);
servaddr.sin6_port = htons(port);
flags = fcntl(fd, F_GETFL, 0);
if (flags == -1)
{
close(fd);
return -1;
}
flags |= O_NONBLOCK;
if (fcntl(fd, F_SETFL, flags) == -1)
{
close(fd);
return -1;
}
ret = connect(fd, (struct sockaddr *)&servaddr, iSockLen);
if (ret < 0)
{
if (errno != EINPROGRESS)
{
close(fd);
return -1;
}
struct timeval tv;
fd_set wset;
tv.tv_sec = timeout / 1000;
tv.tv_usec = (timeout % 1000) * 1000;
FD_ZERO(&wset);
FD_SET(fd, &wset);
int n = select(fd + 1, NULL, &wset, NULL, &tv);
if (n <= 0)
{
close(fd);
return -1;
}
len = sizeof(error);
getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len);
if (error)
{
close(fd);
return -1;
}
}
*pSockfd = fd;
return 0;
}
int socket_connect_noblock(const char* ip, const int port, const int timeout, const int ipmode, int* pSockfd)
{
int ret = 0;
switch (ipmode)
{
case IPMODE_IPV4:
ret = socket_connect_ipv4_noblock(ip, port, timeout, pSockfd);
break;
case IPMODE_IPV6:
ret = socket_connect_ipv6_noblock(ip, port, timeout, pSockfd);
break;
default:
return -1;
}
return ret;
}
//精确到毫秒
int ms_difftime(struct timeval start_time, struct timeval end_time)
{
long start = start_time.tv_sec * 1000 + start_time.tv_usec * 0.001;
long end = end_time.tv_sec * 1000 + end_time.tv_usec * 0.001;
return end - start;
}
int socket_send_noblock(int fd, char* buf, int len, struct timeval start_time, int deal_time)
{
if (NULL == buf || len < 0)
{
return SYD_NET_PARAM_ERR;
}
struct timeval local_time;
int ret = 0, send_bytes = 0; //已发送的字节数
while(send_bytes < len)
{
gettimeofday(&local_time, NULL);
if(deal_time < ms_difftime(start_time, local_time))
{
LOG_NET("socket_send_noblock overtime ret=%08x", SYD_NET_OVERTIME);
return SYD_NET_OVERTIME;
}
ret = send(fd, buf + send_bytes, len - send_bytes, MSG_NOSIGNAL|MSG_DONTWAIT);
if(ret < 0)
{
if(errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)
{
continue;
}
LOG_NET("send err ret=%08x", SYD_NET_SEND_ERR);
return SYD_NET_SEND_ERR;
}
else if(ret == 0)
{
LOG_NET("send err ret=%08x", SYD_NET_NOBLOCK_CLOSE);
return SYD_NET_NOBLOCK_CLOSE;
}
send_bytes += ret;
}
return SYD_OK;
}
int socket_recv_noblock(int fd, char* buf, int len, struct timeval start_time, int deal_time)
{
if (NULL == buf || len < 0)
{
return SYD_NET_PARAM_ERR;
}
struct timeval local_time;
int ret = 0, recv_bytes = 0; //已接受的字节数
while (recv_bytes < len)
{
gettimeofday(&local_time, NULL);
if(deal_time < ms_difftime(start_time, local_time))
{
LOG_NET("socket_recv_noblock overtime ret=%08x", SYD_NET_OVERTIME);
return SYD_NET_OVERTIME;
}
ret = recv(fd, buf + recv_bytes, len - recv_bytes, MSG_NOSIGNAL|MSG_DONTWAIT);
if(ret < 0)
{
if(errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)
{
continue;
}
LOG_NET("recv err ret=%08x", SYD_NET_RECV_ERR);
return SYD_NET_RECV_ERR;
}
else if(ret == 0)
{
LOG_NET("recv err ret=%08x", SYD_NET_NOBLOCK_CLOSE);
return SYD_NET_NOBLOCK_CLOSE;
}
recv_bytes += ret;
}
return SYD_OK;
}
#if 0
int socket_recv_noblock(int fd, char* buf, int len, struct timeval start_time, int deal_time)
{
if (NULL == buf || len < 0)
{
return SYD_NET_PARAM_ERR;
}
struct timeval local_time;
int ret = 0, recv_bytes = 0; //已接受的字节数
while (recv_bytes < len)
{
gettimeofday(&local_time, NULL);
if(deal_time < ms_difftime(start_time, local_time))
{
LOG_NET("socket_recv_noblock overtime ret=%08x", SYD_NET_OVERTIME);
return SYD_NET_OVERTIME;
}
ret = recv(fd, buf + recv_bytes, 1, MSG_NOSIGNAL|MSG_DONTWAIT);
if(ret < 0)
{
if(errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)
{
continue;
}
LOG_NET("recv err ret=%08x", SYD_NET_RECV_ERR);
return SYD_NET_RECV_ERR;
}
else if(ret == 0)
{
LOG_NET("recv err ret=%08x", SYD_NET_NOBLOCK_CLOSE);
return SYD_NET_NOBLOCK_CLOSE;
}
recv_bytes += ret;
}
return SYD_OK;
}
#endif
void socket_close_noblock(int fd)
{
if(fd != -1)
{
close(fd);
}
}

71
src/public.c Normal file
View File

@ -0,0 +1,71 @@
#ifndef _TYPEDEF_H_
#include "typedef.h"
#endif
#ifndef _PUBLIC_H_
#include "public.h"
#endif
#ifndef _LOG_H_
#include "log.h"
#endif
static const char g_cHexToAsc1[] = "0123456789ABCDEF";
static int g_iTable_ASC_HEX[] =
{
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0x40, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
};
void P_BinToHex(
char* pcInBuf,
int iInBufLen,
char* pcOutBuf)
{
for (; iInBufLen > 0; iInBufLen--)
{
(*pcOutBuf++) = g_cHexToAsc1[((*pcInBuf) >> 4) & 0xf];
(*pcOutBuf++) = g_cHexToAsc1[(*pcInBuf++) & 0xf];
}
}
void P_HexToBin(
char* pcInBuf,
int iInBufLen,
char* pcOutBuf)
{
for (; iInBufLen > 0; iInBufLen -= 2, pcInBuf += 2)
{
(*pcOutBuf++) = (g_iTable_ASC_HEX[(*pcInBuf)] << 4) | g_iTable_ASC_HEX[*(pcInBuf + 1)];
}
}
int P_GetWorkPath(char *pcWorkPath)
{
int iCount = -1, i = 0;
char cWorkPath[1024] = {0};
iCount = readlink("/proc/self/exe", cWorkPath, 1024);
if (iCount < 0 || iCount >= 1024)
{
LOG("iCount=%d ret=%08x", iCount, -1);
return SYD_FAIL;
}
cWorkPath[iCount] = '\0';
for (i = iCount; i >= 0; --i)
{
if (cWorkPath[i] == '/')
{
cWorkPath[i] = 0;
break;
}
}
memcpy(pcWorkPath, cWorkPath, strlen(cWorkPath));
return SYD_OK;
}

141
src/queue.c Normal file
View File

@ -0,0 +1,141 @@
#ifndef _QUEUE_H_
#include "queue.h"
#endif
#ifndef _TYPEDEF_H_
#include "typedef.h"
#endif
#ifndef _LOG_H_
#include "log.h"
#endif
#define QUEUE_HANDLE_FAIL 0
#define QUEUE_HANDLE_OK 1
queue_t* queue_init(int capacity)
{
queue_t* queue = (queue_t*)malloc(sizeof(queue_t));
if (queue == NULL)
{
LOG("malloc queue err ret=%08x", SYD_MEMORY_ERR);
return NULL;
}
memset(queue, 0, sizeof(queue_t));
queue->task = (task_t*)malloc(sizeof(task_t) * capacity);
if (queue->task == NULL)
{
LOG("malloc task err ret=%08x", SYD_MEMORY_ERR);
return NULL;
}
memset(queue->task, 0, sizeof(task_t) * capacity);
queue->head = 0;
queue->tail = 0;
queue->length = 0;
queue->capacity = capacity;
queue->status = QUEUE_HANDLE_OK;
return queue;
}
void queue_destory(queue_t* queue)
{
if (queue == NULL)
{
return;
}
if (queue->task != NULL)
{
free(queue->task);
queue->task = NULL;
}
queue->status = QUEUE_HANDLE_FAIL;
free(queue);
queue = NULL;
}
void queue_clear(queue_t* queue)
{
queue->head = 0;
queue->tail = 0;
queue->length = 0;
}
int queue_getlength(queue_t* queue)
{
if (queue == NULL)
{
LOG("queue == NULL ret=%04x", SYD_PARAM_ERR);
return SYD_PARAM_ERR;
}
if (queue->status != QUEUE_HANDLE_OK)
{
LOG("queue->status != QUEUE_HANDLE_OK ret=%08x", SYD_QUEUE_HANDLE_ERR);
return SYD_QUEUE_HANDLE_ERR;
}
return AO_GET(&queue->length);
}
int queue_enqueue(queue_t* queue, int* (*function)(void* arg, void *device), void *arg, void *device)
{
if (queue == NULL)
{
LOG("queue == NULL ret=%04x", SYD_PARAM_ERR);
return SYD_PARAM_ERR;
}
if (queue->status != QUEUE_HANDLE_OK)
{
LOG("queue->status != QUEUE_HANDLE_OK ret=%08x", SYD_QUEUE_HANDLE_ERR);
return SYD_QUEUE_HANDLE_ERR;
}
/*队列是否已满*/
if (AO_GET(&queue->length) == queue->capacity)
{
//LOG("queue is full ret=%04x", SYD_QUEUE_ISFULL);
return SYD_QUEUE_ISFULL;
}
queue->task[queue->tail].function = function;
queue->task[queue->tail].arg = arg;
queue->task[queue->tail].device = device;
queue->tail = (queue->tail + 1) % queue->capacity;
AO_F_ADD(&queue->length, 1);
return SYD_OK;
}
int queue_dequeue(queue_t* queue, int* (*function)(void* arg, void *device), void *arg, void *device)
{
if (queue == NULL)
{
LOG("queue == NULL ret=%04x", SYD_PARAM_ERR);
return SYD_PARAM_ERR;
}
if (queue->status != QUEUE_HANDLE_OK)
{
LOG("queue->status != QUEUE_HANDLE_OK ret=%08x", SYD_QUEUE_HANDLE_ERR);
return SYD_QUEUE_HANDLE_ERR;
}
/*队列是否为空*/
if (AO_GET(&queue->length) == 0)
{
//LOG("queue is empty ret=%04x", SYD_QUEUE_ISEMPTY);
return SYD_QUEUE_ISEMPTY;
}
function = queue->task[queue->head].function;
arg = queue->task[queue->head].arg;
device = queue->task[queue->head].device;
queue->head = (queue->head + 1) % queue->capacity;
AO_F_SUB(&queue->length, 1);
return SYD_OK;
}

2076
src/sunyard.c Normal file

File diff suppressed because it is too large Load Diff

3180
src/sunyard_d.c Normal file

File diff suppressed because it is too large Load Diff

517
src/threadpool.c Normal file
View File

@ -0,0 +1,517 @@
#ifndef _THREAD_POOL_H_
#include "threadpool.h"
#endif
#ifndef _NETAPI_H_
#include "netapi.h"
#endif
#ifndef _LOG_H_
#include "log.h"
#endif
static void threadpool_free_ex(threadpool_t *pool)
{
if (pool == NULL)
{
return;
}
int i = 0;
for(i = 0; i < pool->total_thr_num; i++)
{
queue_destory(pool->queue[i]);
}
if (pool->work_threads)
{
free(pool->work_threads);
pool->work_threads = NULL;
}
if (pool)
{
free(pool);
pool = NULL;
}
}
int threadpool_create_connect(
threadpool_t *threadpool,
const char *pcIpList[],
int iPortList[],
int dev_num,
int iConnectTimeout)
{
int ret = 0;
int tmp_fd = -1, tmp_flag = TRUE;
int i = 0, j = 0, k = 0;
int err_device[P_DEVICE_MAX_COUNT] = {0};
int err_device_count = 0;
/*1、尝试连接*/
for(i = 0; i < dev_num; i++)
{
ret = socket_connect_noblock(pcIpList[i], iPortList[i], iConnectTimeout, IPMODE_IPV4, &tmp_fd);
if(ret != 0)
{
err_device[k] = i; //记录有问题的机器
err_device_count++;
k++;
continue;
}
socket_close_noblock(tmp_fd);
tmp_fd = -1;
}
/*所有设备失败直接报错返回*/
if(err_device_count == dev_num)
{
for(i = 0; i < err_device_count; i++)
{
LOG("connect err ip=%s, port=%d, iConnectTimeout=%d\n ret=%08x", pcIpList[i], iPortList[i], iConnectTimeout, SYD_NET_CONNECT_ERR);
}
return SYD_NET_CONNECT_ERR;
}
/*2、对所有线程的中的每个主备机进行连接*/
for (i = 0; i < threadpool->live_thr_num; i++)
{
for (k = 0; k < dev_num; k++)
{
tmp_flag = TRUE;
for(j = 0; j < err_device_count; j++)
{
if(err_device[j] == k)
{
threadpool->work_threads[i].connect_info[k].socket_fd = -1;
threadpool->work_threads[i].connect_info[k].status = FALSE;
tmp_flag = FALSE;
break; //如果连接到错误的机器直接跳过
}
}
if(tmp_flag == FALSE)
{
continue;
}
/*有连接失败不退出,只记录日志*/
ret = socket_connect_noblock(
threadpool->work_threads[i].connect_info[k].ip,
threadpool->work_threads[i].connect_info[k].port,
threadpool->work_threads[i].connect_info[k].con_timeout,
IPMODE_IPV4,
&threadpool->work_threads[i].connect_info[k].socket_fd);
if (ret != SYD_OK)
{
LOG("socket_connect_noblock err ip=%s, port=%d, timeout=%d ret=%08x",
threadpool->work_threads[i].connect_info[k].ip,
threadpool->work_threads[i].connect_info[k].port,
threadpool->work_threads[i].connect_info[k].con_timeout,
ret);
threadpool->work_threads[i].connect_info[k].status = FALSE;
}
else
{
threadpool->work_threads[i].connect_info[k].status = TRUE;
}
}
}
return SYD_OK;
}
int threadpool_set_connect_info(
threadpool_t *threadpool,
const char *pcIpList[],
int iPortList[],
int dev_num,
int iConnectTimeout,
int iDealTimeOut)
{
if(threadpool->shutdown != FALSE)
{
LOG("threadpool->shutdown != FALSE ret=%08x", SYD_THREADPOOL_CLOSE);
return SYD_THREADPOOL_CLOSE;
}
int i = 0, k = 0;
/*对所有线程的中的每个主备机进行连接*/
for (i = 0; i < threadpool->live_thr_num; i++)
{
for (k = 0; k < dev_num; k++)
{
strcpy(threadpool->work_threads[i].connect_info[k].ip, pcIpList[k]);
threadpool->work_threads[i].connect_info[k].port = iPortList[k];
threadpool->work_threads[i].connect_info[k].con_timeout = iConnectTimeout;
threadpool->work_threads[i].connect_info[k].deal_timeout = iDealTimeOut;
threadpool->work_threads[i].connect_info[k].status = TRUE;
}
threadpool->work_threads[i].connect_count = dev_num;
threadpool->work_threads[i].connect_idex = 0; //设置主机为首选
}
return SYD_OK;
}
int threadpool_disconnect(threadpool_t *threadpool)
{
if(threadpool->shutdown != FALSE)
{
LOG("threadpool->shutdown != FALSE ret=%08x", SYD_THREADPOOL_CLOSE);
return SYD_THREADPOOL_CLOSE;
}
int i = 0, k = 0;
for (i = 0; i < threadpool->live_thr_num; i++)
{
for (k = 0; k < threadpool->work_threads[i].connect_count; k++)
{
if(threadpool->work_threads[i].connect_info[k].socket_fd != -1)
{
socket_close_noblock(threadpool->work_threads[i].connect_info[k].socket_fd);
threadpool->work_threads[i].connect_info[k].socket_fd = -1;
}
}
}
return SYD_OK;
}
int threadpool_clear_connect_info(threadpool_t *threadpool)
{
if(threadpool->shutdown != FALSE)
{
LOG("threadpool->shutdown != FALSE ret=%08x", SYD_THREADPOOL_CLOSE);
return SYD_THREADPOOL_CLOSE;
}
int i = 0;
for (i = 0; i < threadpool->live_thr_num; i++)
{
memset(threadpool->work_threads[i].connect_info, 0, sizeof(threadpool_connect_info_t));
threadpool->work_threads[i].connect_idex = 0; //恢复主机首选
}
return SYD_OK;
}
static threadpool_task_t *GetTaskWorkThreadInfo(threadpool_t* threadpool, pthread_t thread_id)
{
int i = 0;
for(i = 0; i < threadpool->total_thr_num; i++)
{
if(threadpool->work_threads[i].thread_id == thread_id)
{
return &threadpool->work_threads[i];
}
}
return NULL;
}
void *threadpool_workthread(void *threadpool)
{
threadpool_t *pool = (threadpool_t *)threadpool;
/*查找本线程ID对应的信息*/
pthread_mutex_lock(&pool->queue_mutex);
threadpool_task_t *workthread_info = GetTaskWorkThreadInfo(pool, pthread_self());
if(workthread_info == NULL)
{
LOG("workthread_info == NULL pthread_tid=%ld", pthread_self());
AO_F_SUB(&pool->live_thr_num, 1);
pthread_mutex_unlock(&pool->queue_mutex);
pthread_exit(NULL);
}
LOG_TWO("threadself_id=%ld, workthread_info->thread_id=%ld\n", pthread_self(), workthread_info->thread_id);
pthread_mutex_unlock(&pool->queue_mutex);
int ret = 0, sig = 0;
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGUSR1);
ret = pthread_sigmask(SIG_BLOCK, &mask, NULL);
if (ret != 0)
{
LOG("pthread_sigmask err ret=%04x", SYD_FAIL);
AO_F_SUB(&pool->live_thr_num, 1);
pthread_exit(NULL);
}
do
{
while (queue_getlength(workthread_info->work_queue) <= 0 && pool->shutdown == FALSE)
{
ret = sigwait(&mask, &sig);
if (ret != 0)
{
LOG("sigwait err ret=%04x", SYD_FAIL);
break;
}
}
if (pool->shutdown == TRUE)
{
LOG_TWO("thread %lu is exiting \n", pthread_self());
AO_F_SUB(&pool->live_thr_num, 1);
pthread_exit(NULL);
return NULL;
}
if (workthread_info->work_queue == NULL)
{
LOG("queue == NULL ret=%04x", SYD_PARAM_ERR);
break;
}
if (workthread_info->work_queue->status != 1)
{
LOG("queue->status != QUEUE_HANDLE_OK ret=%04x", SYD_QUEUE_HANDLE_ERR);
break;
}
/*队列是否为空*/
if (queue_getlength(workthread_info->work_queue) <= 0)
{
continue;
}
AO_F_ADD(&pool->task_num, 1);
AO_F_ADD(&pool->busy_thr_num, 1);
(*(workthread_info->work_queue->task[workthread_info->work_queue->head].function))(
workthread_info->work_queue->task[workthread_info->work_queue->head].arg,
workthread_info);
workthread_info->work_queue->head = (workthread_info->work_queue->head + 1) % workthread_info->work_queue->capacity;
AO_F_SUB(&workthread_info->work_queue->length, 1);
AO_F_SUB(&pool->busy_thr_num, 1);
} while (1);
AO_F_SUB(&pool->live_thr_num, 1);
return 0;
}
threadpool_t* threadpool_create(int thread_num, int queue_max_size)
{
int ret = 0, i = 0;
threadpool_t *pool = NULL;
do
{
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGUSR1);
ret = pthread_sigmask(SIG_BLOCK, &mask, NULL);
if (ret != 0)
{
LOG("pthread_sigmask err ret=%04x", SYD_FAIL);
pthread_exit(NULL);
}
/*线程池空间开辟*/
if ((pool = (threadpool_t *)malloc(sizeof(threadpool_t))) == NULL)
{
LOG("malloc pool err ret=%08x", SYD_MEMORY_ERR);
return NULL;
}
memset(pool, 0, sizeof(threadpool_t));
pool->total_thr_num = thread_num;
pool->busy_thr_num = 0;
pool->live_thr_num = thread_num;
pool->task_num = 0;
pool->queue_max_size = queue_max_size;
pool->work_threads = (threadpool_task_t *)malloc(sizeof(threadpool_task_t) * thread_num);
if (pool->work_threads == NULL)
{
LOG("malloc pool->work_threads err ret=%08x", SYD_MEMORY_ERR);
break;
}
memset(pool->work_threads, 0, sizeof(threadpool_task_t) * thread_num);
/*创建所有工作队列*/
for (i = 0; i < thread_num; i++)
{
pool->queue[i] = queue_init(queue_max_size);
if(pool->queue[i] == NULL)
{
LOG("pool->queue[i] err ret=%04x", i, SYD_MEMORY_ERR);
threadpool_free_ex(pool);
return NULL;
}
pool->work_threads[i].work_queue = pool->queue[i];
}
/*创建所有工作线程*/
for (i = 0; i < thread_num; i++)
{
ret = pthread_create(&(pool->work_threads[i].thread_id), NULL, threadpool_workthread, (void *)pool);
if (ret != 0)
{
LOG("work pthread_create[%d] err ret=%08x", i, SYD_THREAD_CREATE_ERR);
threadpool_free_ex(pool);
return NULL;
}
pthread_detach(pool->work_threads[i].thread_id);
LOG_TWO("work thread %ld\n", (unsigned long)(pool->work_threads[i].thread_id));
}
/*初始化队列锁*/
pthread_mutex_init(&pool->queue_mutex, NULL);
pool->shutdown = FALSE;
usleep(5000); //线程创建后不能立即响应功能,所以在这里强行等待半秒
LOG_MSG("threadpool_create_ex ok");
return pool;
} while (0);
/* 释放pool的空间 */
threadpool_free_ex(pool);
return NULL;
}
void *threadpool_adminthread(void *threadpool)
{
threadpool_t *pool = (threadpool_t *)threadpool;
int ret = 0;
int i = 0, k = 0;
while(1)
{
for(k = 0; k < pool->live_thr_num; k++)
{
for(i = 0; i < pool->work_threads[k].connect_count; i++)
{
if (pool->shutdown != FALSE)
{
LOG("pool->shutdown == TRUE ret=%08x", SYD_THREADPOOL_CLOSE);
pthread_exit(NULL);
return NULL;
}
if(pool->work_threads[k].connect_info[i].status == FALSE)
{
ret = socket_connect_noblock(
pool->work_threads[k].connect_info[i].ip,
pool->work_threads[k].connect_info[i].port,
pool->work_threads[k].connect_info[i].con_timeout,
IPMODE_IPV4,
&pool->work_threads[k].connect_info[i].socket_fd);
if(ret != SYD_OK)
{
/*当前连接失败,放弃次连接尝试下一个连接*/
continue;
}
}
pool->work_threads[k].connect_info[i].status = TRUE;
}
}
usleep(5000);
}
}
int threadpool_device_admin(threadpool_t *threadpool)
{
threadpool_t *pool = (threadpool_t *)threadpool;
if (pool->shutdown != FALSE)
{
LOG("pool->shutdown == TRUE ret=%08x", SYD_THREADPOOL_CLOSE);
return SYD_THREADPOOL_CLOSE;
}
int ret = 0;
ret = pthread_create(&pool->admin_thread_id, NULL, threadpool_adminthread, (void *)pool);
if (ret != 0)
{
LOG("admin pthread_create err ret=%08x", SYD_THREAD_CREATE_ERR);
return SYD_THREAD_CREATE_ERR;
}
pthread_detach(pool->admin_thread_id);
return SYD_OK;
}
int threadpool_add_task(threadpool_t *threadpool, int* (*function)(void* arg, void* device), void* arg, void* device)
{
threadpool_t *pool = (threadpool_t *)threadpool;
if (pool->shutdown != FALSE)
{
LOG("pool->shutdown == TRUE ret=%08x", SYD_THREADPOOL_CLOSE);
return SYD_THREADPOOL_CLOSE;
}
int ret = 0;
int queue_pend_size = 0;
while (1)
{
pool->free_queue = pool->free_queue % AO_GET(&pool->live_thr_num);
queue_pend_size = queue_getlength(pool->work_threads[pool->free_queue].work_queue);
if(queue_pend_size >= pool->queue_max_size)
{
pool->free_queue++;
continue;
}
ret = queue_enqueue(pool->work_threads[pool->free_queue].work_queue, function, arg, device);
if(ret != SYD_OK)
{
LOG("queue_enqueue err ret=%04x", ret);
break;
}
pthread_kill(pool->work_threads[pool->free_queue].thread_id, SIGUSR1);
pool->free_queue++;
break;
}
return SYD_OK;
}
/*精确到s*/
static int threadpool_destory_difftime(struct timeval start_time, struct timeval end_time)
{
int start = start_time.tv_sec;
int end = end_time.tv_sec;
return end - start;
}
int threadpool_destroy(threadpool_t *threadpool)
{
if (threadpool == NULL || threadpool->shutdown != FALSE)
{
LOG("threadpool == NULL ret=%04x", SYD_THREADPOOL_HANDLE_ERROR);
return SYD_THREADPOOL_HANDLE_ERROR;
}
int ret = 0, i = 0;
int thread_live_num = 0;
thread_live_num = AO_GET(&threadpool->live_thr_num);
for (i = 0; i < thread_live_num; i++)
{
ret = pthread_cancel(threadpool->work_threads[i].thread_id);
if (ret == 0)
{
AO_F_SUB(&threadpool->live_thr_num, 1);
}
}
pthread_cancel(threadpool->admin_thread_id);
threadpool->shutdown = TRUE;
struct timeval start_time, local_time;
gettimeofday(&start_time, NULL);
while (1)
{
if (0 >= AO_GET(&threadpool->live_thr_num))
{
pthread_mutex_destroy(&threadpool->queue_mutex);
threadpool_free_ex(threadpool);
break;
}
else
{
usleep(5000);
gettimeofday(&local_time, NULL);
if(5 < threadpool_destory_difftime(start_time, local_time)) //大于5s直接退出
{
LOG("threadpool_destroy_ex overtime ret=%08x", SYD_THREAPOOL_DESTORY_OVERTIME);
return SYD_THREAPOOL_DESTORY_OVERTIME;
}
continue;
}
}
LOG_MSG("threadpool_destroy_ex ok");
return SYD_OK;
}

456
src/trans.c Normal file
View File

@ -0,0 +1,456 @@
#ifndef _TYPEDEF_H_
#include "typedef.h"
#endif
#ifndef _SUNYARD_D_H_
#include "sunyard_d.h"
#endif
#ifndef _NETAPI_H_
#include "netapi.h"
#endif
#ifndef _TRANS_H_
#include "trans.h"
#endif
#ifndef _LOG_H_
#include "log.h"
#endif
int Get_retcode(TRD_PKG_ST *pkg)
{
unsigned char cmd[3] = {0};
memcpy(cmd, Get_cmd(pkg), 2);
if ((memcmp(cmd, "\x80\x00" ,2) > 0 && memcmp(cmd, "\x80\x21", 2) < 0) ||
(memcmp(cmd, "\x3E\x80", 2) >= 0 && memcmp(cmd, "\x3E\x90", 2) < 0))
{
return (pkg->data[0]*256 + pkg->data[1]);
}
else
{
return (pkg->data[0] - 0x30)*16 + (pkg->data[1] - 0x30);
}
}
unsigned int Get_sn(TRD_PKG_ST *pkg)
{
return pkg->HEADER[6]*256 + pkg->HEADER[7];
}
char *Get_cmd(TRD_PKG_ST *pkg)
{
return (char *)pkg->COMMAND;
}
int Get_length(TRD_PKG_ST *pkg)
{
return pkg->LENGTH[0]*256 + pkg->LENGTH[1];
}
void Set_sn(TRD_PKG_ST *pkg, unsigned int sn)
{
pkg->HEADER[6] = sn/256;
pkg->HEADER[7] = sn%256;
}
void Set_cmd(TRD_PKG_ST *pkg, char *cmd)
{
if (strlen(cmd) < 2)
{
return;
}
pkg->COMMAND[0] = cmd[0];
pkg->COMMAND[1] = cmd[1];
}
void Set_length(TRD_PKG_ST *pkg, int length)
{
length += 8+2;
pkg->LENGTH[0] = length/256;
pkg->LENGTH[1] = length%256;
}
int Packet_Recv(int fd, TRD_PKG_ST *pkg, int pkgsize)
{
int len = 0,ret = 0;
char *p = NULL;
p = (char *)pkg;
ret = socket_recv(fd, p, 2);
if (ret < 0)
{
return ret;
}
len = Get_length(pkg);
if (len + 2 > pkgsize)
{
return SYD_NET_PKGLEN_ERR;
}
ret=socket_recv(fd, p+2, len);
if (ret < 0)
{
return ret;
}
len += 2;
return len;
}
int Packet_Send(int fd, TRD_PKG_ST *pkg, int pkgsize)
{
int len = 0, ret = 0;
char *p = NULL;
p = (char *)pkg;
len = Get_length(pkg);
len += 2;
if (len + 2 > pkgsize)
{
return SYD_NET_PKGLEN_ERR;
}
ret = socket_send(fd,p,len);
if (ret < 0)
{
return ret;
}
return len;
}
void SetDataLength(int iInData, unsigned char* pcOutData)
{
pcOutData[0] = iInData / 256;
pcOutData[1] = iInData % 256;
}
int GetDataLength(unsigned char* pcInData)
{
return pcInData[0] * 256 + pcInData[1];
}
int Packet_Recv_Noblock(int fd, TRD_PKG_ST *pkg, int pkgsize, struct timeval start_time, int deal_time)
{
int len = 0, ret = 0;
char *p = NULL;
p = (char *)pkg;
ret = socket_recv_noblock(fd, p, 2, start_time, deal_time);
if (ret < 0)
{
return ret;
}
len = Get_length(pkg);
if (len + 2 > pkgsize)
{
return SYD_NET_PKGLEN_ERR;
}
ret = socket_recv_noblock(fd, p + 2, len, start_time, deal_time);
if (ret < 0)
{
return ret;
}
len += 2;
return len;
}
int Packet_Send_Noblock(int fd, TRD_PKG_ST *pkg, int pkgsize, struct timeval start_time, int deal_time)
{
int len = 0, ret = 0;
char *p = NULL;
p = (char *)pkg;
len = Get_length(pkg);
len += 2;
if (len + 2 > pkgsize)
{
return SYD_NET_PKGLEN_ERR;
}
ret = socket_send_noblock(fd, p, len, start_time, deal_time);
if (ret < 0)
{
return ret;
}
return len;
}
int TP_Process_NoBlock_Ordinary(
char *cmd,
TRD_PKG_ST *send_pkg,
TRD_PKG_ST *recv_pkg,
STC_CONNECT_INFO *connect_info,
int *connect_idex,
int device_count,
int deal_time)
{
if(device_count <= 0)
{
LOG("device_count=%d, ret=%08x", device_count, SYD_DEVICE_NUM_ERR);
return SYD_DEVICE_NUM_ERR;
}
struct timeval start_time;
struct timeval local_time;
struct timeval start_switch_time;
struct timeval local_switch_time;
int tmp_dealtime = deal_time / device_count;
int ret = 0, length = 0;
static unsigned short global_sn = 0;
unsigned short local_sn;
local_sn = global_sn;
if(global_sn == 65535)
{
global_sn = 0;
}
else
{
global_sn++;
}
Set_sn(send_pkg,local_sn);
Set_cmd(send_pkg,cmd);
gettimeofday(&start_switch_time, NULL);
/*切换时间开始计时*/
while(1)
{
if(ret < 0)
{
gettimeofday(&local_switch_time, NULL);
if(deal_time < ms_difftime(start_switch_time, local_switch_time))
{
LOG_NET("device switch overtime ret=%08x", SYD_NET_OVERTIME);
return SYD_NET_OVERTIME;
}
}
/*交易起始时间*/
LOG_PrintHex("Send", (unsigned char *)send_pkg, Get_length(send_pkg) + 2);
gettimeofday(&start_time, NULL);
ret = Packet_Send_Noblock(connect_info[*connect_idex].socket_fd, send_pkg, sizeof(TRD_PKG_ST), start_time, tmp_dealtime);
if (ret < 0)
{
if(connect_info[*connect_idex].socket_fd != -1)
{
socket_close_noblock(connect_info[*connect_idex].socket_fd);
connect_info[*connect_idex].socket_fd = -1;
}
/*设置当前连接状态为错误状态*/
connect_info[*connect_idex].status = FALSE;
if(*connect_idex + 1 >= device_count)
{
*connect_idex = 0;
}
else
{
*connect_idex += 1;
}
continue;
}
gettimeofday(&local_time, NULL);
ret = Packet_Recv_Noblock(connect_info[*connect_idex].socket_fd, recv_pkg, sizeof(TRD_PKG_ST), start_time, tmp_dealtime - ms_difftime(start_time, local_time));
if (ret < 0)
{
if(connect_info[*connect_idex].socket_fd != -1)
{
socket_close_noblock(connect_info[*connect_idex].socket_fd);
connect_info[*connect_idex].socket_fd = -1;
}
/*设置当前连接状态为错误状态*/
connect_info[*connect_idex].status = FALSE;
if(*connect_idex + 1 >= device_count)
{
*connect_idex = 0;
}
else
{
*connect_idex += 1;
}
continue;
}
LOG_PrintHex("Recv", (unsigned char *)recv_pkg, Get_length(recv_pkg) + 2);
break;
}
if (Get_sn(recv_pkg) != local_sn)
{
LOG("Get_sn err ret=%08x", SYD_NET_SN_ERR);
return SYD_NET_SN_ERR;
}
cmd[1]++;
if (memcmp(Get_cmd(recv_pkg), cmd, 2))
{
LOG("Get_cmd err ret=%08x", SYD_NET_CMD_ERR);
return SYD_NET_CMD_ERR;
}
ret = Get_retcode(recv_pkg);
if(ret == 0x49)
return SYD_MAC_CHECK_ERROR;
else
return ret;
return 0;
}
int TP_Process_NoBlock_Standby(char *cmd, TRD_PKG_ST *send_pkg, TRD_PKG_ST *recv_pkg, void *device, int deal_time)
{
threadpool_task_t *task_t = (threadpool_task_t *)device;
if(task_t->connect_count <= 0)
{
LOG("task_t->connect_count=%d, ret=%08x", task_t->connect_count, SYD_DEVICE_NUM_ERR);
return SYD_DEVICE_NUM_ERR;
}
struct timeval start_time;
struct timeval local_time;
struct timeval start_switch_time;
struct timeval local_switch_time;
int ret = 0, length = 0;
int tmp_dealtime = deal_time / task_t->connect_count;
static unsigned short global_sn = 0;
unsigned short local_sn;
local_sn = global_sn;
if(global_sn == 65535)
{
global_sn = 0;
}
else
{
global_sn++;
}
Set_sn(send_pkg,local_sn);
Set_cmd(send_pkg,cmd);
/*切换时间开始计时*/
gettimeofday(&start_switch_time, NULL);
while(1)
{
if(ret < 0)
{
gettimeofday(&local_switch_time, NULL);
if(deal_time < ms_difftime(start_switch_time, local_switch_time))
{
LOG_NET("device switch overtime ret=%08x", SYD_NET_OVERTIME);
return SYD_NET_OVERTIME;
}
}
/*交易起始时间*/
gettimeofday(&start_time, NULL);
LOG_PrintHex("Send", (unsigned char *)send_pkg, Get_length(send_pkg) + 2);
ret = Packet_Send_Noblock(task_t->connect_info[task_t->connect_idex].socket_fd, send_pkg, sizeof(TRD_PKG_ST), start_time, tmp_dealtime);
if (ret < 0)
{
if(task_t->connect_info[task_t->connect_idex].socket_fd != -1)
{
socket_close_noblock(task_t->connect_info[task_t->connect_idex].socket_fd);
task_t->connect_info[task_t->connect_idex].socket_fd = -1;
}
/*设置当前连接状态为错误状态*/
task_t->connect_info[task_t->connect_idex].status = FALSE;
if(task_t->connect_idex + 1 >= task_t->connect_count)
{
task_t->connect_idex = 0;
}
else
{
task_t->connect_idex += 1;
}
continue;
}
gettimeofday(&local_time, NULL);
ret = Packet_Recv_Noblock(task_t->connect_info[task_t->connect_idex].socket_fd, recv_pkg, sizeof(TRD_PKG_ST), start_time, tmp_dealtime - ms_difftime(start_time, local_time));
if (ret < 0)
{
if(task_t->connect_info[task_t->connect_idex].socket_fd != -1)
{
socket_close_noblock(task_t->connect_info[task_t->connect_idex].socket_fd);
task_t->connect_info[task_t->connect_idex].socket_fd = -1;
}
/*设置当前连接状态为错误状态*/
task_t->connect_info[task_t->connect_idex].status = FALSE;
if(task_t->connect_idex + 1 >= task_t->connect_count)
{
task_t->connect_idex = 0;
}
else
{
task_t->connect_idex += 1;
}
continue;
}
LOG_PrintHex("Recv", (unsigned char *)recv_pkg, Get_length(recv_pkg) + 2);
break;
}
if (Get_sn(recv_pkg) != local_sn)
{
LOG("Get_sn err ret=%08x", SYD_NET_SN_ERR);
return SYD_NET_SN_ERR;
}
cmd[1]++;
if (memcmp(Get_cmd(recv_pkg), cmd, 2))
{
LOG("Get_cmd err ret=%08x", SYD_NET_CMD_ERR);
return SYD_NET_CMD_ERR;
}
ret = Get_retcode(recv_pkg);
if(ret == 0x49)
return SYD_MAC_CHECK_ERROR;
else
return ret;
return 0;
}
static int *T_Threadpool_PkgDeal(void* arg, void *device)
{
TRD_PKG_THREADPOOL_ST *pkg_threadpool_st = (TRD_PKG_THREADPOOL_ST *)arg;
pkg_threadpool_st->task_ret = TP_Process_NoBlock_Standby(
pkg_threadpool_st->cmd,
&pkg_threadpool_st->send_pkg_st,
&pkg_threadpool_st->recv_pkg_st,
device,
pkg_threadpool_st->deal_time);
pkg_threadpool_st->task_flag = P_THREADAPOOL_PKG_FLAG_OK;
return SYD_OK;
}
int TP_Process_NoBlock(
threadpool_t *threadpool,
pthread_mutex_t *threadpool_mutex,
TRD_PKG_THREADPOOL_ST *pkg_threadpool_st,
int pkg_number)
{
int ret = 0;
struct timeval local_time;
pkg_threadpool_st->task_ret = 0;
pkg_threadpool_st->task_flag = P_THREADAPOOL_PKG_FLAG_FAIL;
pthread_mutex_lock(threadpool_mutex);
ret = threadpool_add_task(threadpool, T_Threadpool_PkgDeal, (void *)pkg_threadpool_st, NULL);
pthread_mutex_unlock(threadpool_mutex);
if(ret != SYD_OK)
{
LOG("threadpool_add_task err ret=%08x", ret);
return ret;
}
if(pkg_number == P_BATCH_ONLY_ONE)
{
while(1)
{
if(pkg_threadpool_st->task_flag == P_THREADAPOOL_PKG_FLAG_OK)
{
return pkg_threadpool_st->task_ret;
}
}
}
return SYD_OK;
}

13
测试说明.txt Normal file
View File

@ -0,0 +1,13 @@
1、该测试需要提前手动合成密钥密钥合成方式如下
机构号16字节0 类型:ZEK(00A) 索引:8字节0 方案:S 不变种 分量个数:2 (金交所使用的是方案S)
这里用的密钥分量为
分量1:31313131313131313131313131313131
分量2:32323232323232323232323232323232
合成后的分量:03030303030303030303030303030303
校验值:9602336689EBE514
分量1:32323232323232323232323232323232
分量2:33333333333333333333333333333333
校验值:82F1B998DEBBB05E
2、在demo.c的宏定义中架构IP改为测试的IP