init
This commit is contained in:
commit
7ec0389a8a
36
.vscode/launch.json
vendored
Normal file
36
.vscode/launch.json
vendored
Normal 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
10
.vscode/settings.json
vendored
Normal 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
48
.vscode/tasks.json
vendored
Normal 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
54
demo/Makefile
Normal 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
579
demo/demo.c
Normal 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;
|
||||
}
|
||||
|
||||
/*
|
||||
*注意:该测试需要提前手动合成密钥,密钥合成方式如下
|
||||
*机构号16字节0 类型:ZEK(00A) 索引:8字节0 方案: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
1449
demo/demo_api.c
Normal file
File diff suppressed because it is too large
Load Diff
53
demo/demo_api.h
Normal file
53
demo/demo_api.h
Normal 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
24
demo/demo_typedef.h
Normal 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
462
demo/demo_xn.c
Normal 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;
|
||||
}
|
||||
BIN
doc/上金所存储加密C接口设计V1.02.docx
Normal file
BIN
doc/上金所存储加密C接口设计V1.02.docx
Normal file
Binary file not shown.
BIN
doc/上金所存储加密C接口设计V1.02.pdf
Normal file
BIN
doc/上金所存储加密C接口设计V1.02.pdf
Normal file
Binary file not shown.
BIN
doc/上金所存储加密C接口设计V1.03.docx
Normal file
BIN
doc/上金所存储加密C接口设计V1.03.docx
Normal file
Binary file not shown.
BIN
doc/上金所存储加密C接口设计V1.03.pdf
Normal file
BIN
doc/上金所存储加密C接口设计V1.03.pdf
Normal file
Binary file not shown.
BIN
doc/金交所存储加密C接口详细设计V1.00.doc
Normal file
BIN
doc/金交所存储加密C接口详细设计V1.00.doc
Normal file
Binary file not shown.
41
inc/error.h
Normal file
41
inc/error.h
Normal 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
36
inc/log.h
Normal 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
55
inc/netapi.h
Normal 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
53
inc/public.h
Normal 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
39
inc/queue.h
Normal 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
225
inc/sunyard.h
Normal 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
215
inc/sunyard_d.h
Normal 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
103
inc/threadpool.h
Normal 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
48
inc/trans.h
Normal 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
51
inc/typedef.h
Normal 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
7
run.sh
Normal 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
65
src/Makefile
Normal 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
298
src/log.c
Normal 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
431
src/netapi.c
Normal 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
71
src/public.c
Normal 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
141
src/queue.c
Normal 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
2076
src/sunyard.c
Normal file
File diff suppressed because it is too large
Load Diff
3180
src/sunyard_d.c
Normal file
3180
src/sunyard_d.c
Normal file
File diff suppressed because it is too large
Load Diff
517
src/threadpool.c
Normal file
517
src/threadpool.c
Normal 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
456
src/trans.c
Normal 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
13
测试说明.txt
Normal 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
|
||||
Loading…
Reference in New Issue
Block a user