企业信息系统集成框架(设计思路)C模式
1.客户端.h文件
#pragma once
#include<stdlib.h>
//A程序员定义接口形式和调用模式 //初始化句柄
typedef int(*Init_Socket)(void **handle); //发送数据,传入句柄中
typedef int(*Send_Socket)(void *handle, unsigned char *sendbuf, int sendLen); //从句柄中输出数据给内存
typedef int(*Recv_Socket)(void *handle, unsigned char *recvBuf, int *recvLen); //销毁句柄
typedef int(*Destroy_Socket)(void **handle); //将函数指针组成一个结构体,用于联系控制厂商的软件要求
typedef struct _CSocketProtocol
{ Init_Socket Init;
Send_Socket Send;
Recv_Socket Recv;
Destroy_Socket Destroy; }CSocketProtocol; //中间控制层:将实现的函数与句柄中的变量关联在一起
int Init_CSocketProtocol(CSocketProtocol *csp,
Init_Socket Init,
Send_Socket Send,
Recv_Socket Recv,
Destroy_Socket Destroy
);
2.厂商的产品实现(包含两段代码1. 产品.h文件 2.产品代码实现)
#pragma once
#include<stdlib.h>
//厂商实现各接口函数。 typedef struct _HD
{
unsigned char *data;
int dataLen;
}HD; int Init_Socket1(void **handle);
int Send_Socket1(void *handle, unsigned char *sendbuf, int sendLen);
int Recv_Socket1(void *handle, unsigned char *recvBuf, int *recvLen);
int Destroy_Socket1(void **handle);
#define _CRT_SECURE_NO_WARNINGS
#include"CScklmp1.h"
#include<string.h> //实现初始化句柄。
int Init_Socket1(void **handle)
{
HD *hd = malloc(sizeof(HD));
if (NULL == handle)
return -;
if (NULL == hd)
return -;
hd->data = NULL;
hd->dataLen = ;
*handle = hd; return ;
} //发送数据到句柄
int Send_Socket1 (void *handle, unsigned char *sendbuf, int sendLen)
{
HD *hd = (HD *)handle;
if (NULL == handle)
return -;
if (NULL == sendbuf)
return -; hd->data = malloc(sendLen+);
if (hd->data == NULL)
return -;
strcpy(hd->data, sendbuf);
hd->dataLen = sendLen; return ;
} //有句柄中提取数据
int Recv_Socket1(void *handle, unsigned char *recvBuf, int *recvLen)
{
HD *hd = (HD *)handle;
if (NULL == handle)
return -;
if (NULL == recvBuf)
return -;
if (NULL == recvLen)
return -; strcpy(recvBuf, hd->data);
*recvLen = hd->dataLen; return ;
} //销毁句柄
int Destroy_Socket1(void **handle)
{
HD *hd = (HD *)(*handle); if (NULL == handle)
return -; if (hd->data != NULL)
{
free(hd->data);
hd->data = NULL;
}
free(hd);
hd = NULL; return ;
}
3.客户端加解密(.h文件和代码实现)
#pragma once
#include<stdlib.h>
//加密数据
typedef int(*DesEnc)(unsigned char *inDataBuf, int inDataLen, unsigned char *outDataBuf, int *outDataLen);
//解密数据
typedef int(*DesDec)(unsigned char *inDataBuf, int inDataLen, unsigned char *outDataBuf, int *outDataLen); typedef struct _Des
{
//加密数据
DesEnc EC; //解密数据
DesDec DC; }Des; int Init_DecEnc(Des *de, DesDec DC, DesEnc EC);
#include "EncDec.h" int Init_DecEnc(Des *de, DesEnc EC, DesDec DC)
{
if (de == NULL)
return -;
if (DC == NULL)
return -;
if (EC == NULL)
return -; de->DC = DC;
de->EC = EC; return ;
}
4.厂商的加解密文件(包含两段代码:1.头文件2.代码实现)
#pragma once
//加密数据
int DesEncHw(unsigned char *inDataBuf, int inDataLen, unsigned char *outDataBuf, int *outDataLen);
//解密数据
int DesDecHw(unsigned char *inDataBuf, int inDataLen, unsigned char *outDataBuf, int *outDataLen);
#include "CHwImp.h"
#include"des.h"
//加密数据
int DesEncHw(unsigned char *inDataBuf, int inDataLen, unsigned char *outDataBuf, int *outDataLen)
{
DesEnc(inDataBuf, inDataLen, outDataBuf, outDataLen);
return ;
} //解密数据
int DesDecHw(unsigned char *inDataBuf, int inDataLen, unsigned char *outDataBuf, int *outDataLen)
{
DesDec(inDataBuf, inDataLen, outDataBuf, outDataLen);
return ;
}
5.中间层代码实现
#include "CSocketProtocol.h" //A程序员的调用中间层 int Init_CSocketProtocol(CSocketProtocol *csp,
Init_Socket Init,
Send_Socket Send,
Recv_Socket Recv,
Destroy_Socket Destroy
)
{
if (NULL == csp)
return -;
if (NULL == Init)
return -;
if (NULL == Send)
return -;
if (NULL == Recv)
return -;
if (NULL == Destroy)
return -; csp->Init = Init;
csp->Send = Send;
csp->Recv = Recv;
csp->Destroy = Destroy; return ;
}
6.测试端界面
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h> #include"CSocketProtocol.h"
#include "CHwImp.h"
#include "CScklmp1.h"
#include "EncDec.h"
这段条件编译的代码没有引入加密内容。
#if 0
int FrameWork(CSocketProtocol *csp, unsigned char *sendBuf, int sendLen, unsigned char *recvBuf, int *recvLen)
{
if (NULL == csp)
return -;
if (NULL == sendBuf)
return -;
if (NULL == recvBuf)
return -;
if (NULL == recvLen)
return -; void *handle = NULL;
csp->Init(&handle); csp->Send(handle, sendBuf, sendLen); csp->Recv(handle, recvBuf, recvLen); csp->Destroy(&handle); return ;
} void TestFrameWork01()
{ //创建结构体指针,
CSocketProtocol csp; //给句柄初始化,使接口与实现函数建立关联
Init_CSocketProtocol(&csp, Init_Socket1, Send_Socket1, Recv_Socket1, Destroy_Socket1);
//要发送的数据和长度
unsigned char *sendBuf = "Good Night!!!";
int sendLen = strlen(sendBuf) + ; //要接收数据的内存和长度
unsigned char recvBuf[] = { };
int recvLen = ; FrameWork(&csp, sendBuf, sendLen, recvBuf, &recvLen); printf("接收的数据是:%s\n", recvBuf);
printf("接收的数据长度是:%d\n", recvLen); }
#endif int FrameWorkPro(CSocketProtocol *csp, Des *de, unsigned char *sendBuf, int sendLen, unsigned char *recvBuf, int *recvLen)
{
if (NULL == csp)
return -;
if (NULL == sendBuf)
return -;
if (NULL == recvBuf)
return -;
if (NULL == recvLen)
return -;
if (NULL == de)
return -; void *handle = NULL;
//初始化句柄
csp->Init(&handle); //创建加密内存(接收加密后的文件),加密长度(保存加密文件的长度)
unsigned char DesEncHwBuf[] = { };
int DesEncHwLen = ;
//将发送内容先传入加密工具,进行处理
de->EC(sendBuf, sendLen, DesEncHwBuf, &DesEncHwLen);
csp->Send(handle, DesEncHwBuf, DesEncHwLen); //创建解密内存(先将句柄中的内容解密,放入这个内存),解密长度(保存解密的文件长度)
unsigned char DesDecHwBuf[] = { };
int DesDecHwLen = ; csp->Recv(handle, DesDecHwBuf, &DesDecHwLen); de->DC(DesDecHwBuf, DesDecHwLen, recvBuf, recvLen); csp->Destroy(&handle); return ;
} void TestFrameWork02()
{ //创建结构体,
CSocketProtocol csp;
Des de;
//给句柄初始化,使接口与实现函数建立关联
Init_CSocketProtocol(&csp, Init_Socket1, Send_Socket1, Recv_Socket1, Destroy_Socket1);
Init_DecEnc(&de, DesEncHw, DesDecHw); //要发送的数据和长度
unsigned char *sendBuf = "Good Night!!!";
int sendLen = strlen(sendBuf) + ; //要接收数据的内存和长度
unsigned char recvBuf[] = { };
int recvLen = ; FrameWorkPro(&csp, &de, sendBuf, sendLen, recvBuf, &recvLen); printf("接收的数据是:%s\n", recvBuf);
printf("接收的数据长度是:%d\n", recvLen); } int main(void)
{ TestFrameWork02(); printf("\n");
system("pause");
return ;
}
企业信息系统集成框架(设计思路)C模式的更多相关文章
- 企业信息系统集成框架(设计思路)C++模式
设计要求: 1.企业信息系统框架.第三方产品通过接口层进行分层. 2.企业信息系统框架如何自由的继承第三方产品:通过一个抽象类.(软件设计要求:模块要求松,接口要求紧). 设计步骤: 1.报文的接受与 ...
- App 自动化框架设计思路
最近在整理和学习Appium+Java 自动化框架,对APP自动化框架的部分设想参考了一些文章,先进行整理下: 框架的思路一: 思考引入:https://www.cnblogs.com/yunfeio ...
- Mybatis学习之自定义持久层框架(二) 自定义持久层框架设计思路
前言 上一篇文章讲到了JDBC的基本用法及其问题所在,并提出了使用Mybatis的好处,那么今天这篇文章就来说一下该如何设计一个类似Mybatis这样的持久层框架(暂时只讲思路,具体的代码编写工作从下 ...
- Javascript框架设计思路图
这个系列的随笔都是关于Javascript框架设计一书的读书笔记(作者是司徒正美),不是本人原创!!! 一.简介: 1.市面上主流的JS框架,大多数是由一个个模块组合而成,模块化是大多数让软件所遵循的 ...
- 开源项目CIIP(企业信息管理系统框架).2018.0904版更新介绍
源码: https://github.com/tylike/CIIP https://gitee.com/ciip/CIIP 一,CIIP的目标是什么? 更加简单,快速的建立信息类管理系统.让实施人员 ...
- RPC框架设计思路
RPC是指远程过程调用 1.要解决通讯的问题,主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输.连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远 ...
- 开源项目CIIP(企业信息管理系统框架).2018.1.0910版更新介绍-上周工作总结
又狂撸了一周的代码.简化了0904版本的多数操作. 上一次更新时,总共需要10步,这次简化成3步.嗯嗯,自我感觉不错. 重要的:在创建项目时,可以选择常用模块啦! 第一步:启动CIIP.Designe ...
- Socket开发框架之框架设计及分析
虽然在APP应用.Web应用.Winform应用等大趋势下,越来越多的企业趋向于这些应用系统开发,但是Socket的应用在某些场合是很必要的,如一些停车场终端设备的接入,农业或者水利.压力监测方面的设 ...
- Sizzle源码分析:一 设计思路
一.前言 DOM选择器(Sizzle)是jQuery框架中非常重要的一部分,在H5还没有流行起来的时候,jQuery为我们提供了一个简洁,方便,高效的DOM操作模式,成为那个时代的经典.虽然现在Vue ...
随机推荐
- android 关于Make sure the plugin is properly configured问题的解决办法
这个问题引发的原因最初的报错是: [2013-10-14 10:01:58 - XXX] The connection to adb is down, and a severe error has o ...
- (小规模)b牌棋盘完美覆盖数
(小规模)b牌棋盘完美覆盖数 考虑一个普通的国际象棋棋盘,它被分成8*8(8行8列)的64个正方形.设有形状一样的多米诺骨牌,每张牌恰好覆盖棋盘上相邻的两个方格(即1*2的骨牌).那么能否把32个这样 ...
- 神技!微信小程序(应用号)抢先入门体验(附最新案例-豆瓣电影)持续更新
微信小程序 Demo(豆瓣电影) 由于时间的关系,没有办法写一个完整的说明,后续配合一些视频资料,请持续关注 官方文档:https://mp.weixin.qq.com/debug/wxadoc/de ...
- express-session的简单使用说明
我们知道Internet 通过协议分为stateful和stateless两类,而http是stateless协议,客户端发送请求到服务端建立一个连接,请求得到响应后连接即中断,服务器端不会记录状态, ...
- ORACLE查询表最近更改数据的方法
修改项目时,涉及到了Oracle中许多表的修改(包括:增加.删除字段,修改注释等).由于开始没有进行记录,造成在上测试机时,忘记了具体修改过哪些表了.后来在网上查找了一些资料,例如: 1.select ...
- express.Router创建模块化路由
使用 app.route() 创建路由路径的链式路由句柄.由于路径在一个地方指定,这样做有助于创建模块化的路由,而且减少了代码冗余和拼写错误. 先放小实例: app.js var express = ...
- CDHtmlDialog 基本使用
跳转 Navigate("res://tt.exe/#138"); 138是html的资源号 输入框的Get,set HRESULT CTTDlg::OnButtonCancel( ...
- 扩展 jQuery datebox控件按钮
功能需求: 自定义扩展,将原先的datebox控件按钮进行自定义的扩展: 1.问题: 对原先的时间按钮控件进行更改扩展,新增 “一刻钟” “半小时” “一小时” 选项. 获取原先的 datebox 对 ...
- 二十四种设计模式:备忘录模式(Memento Pattern)
备忘录模式(Memento Pattern) 介绍在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到保存的状态. 示例有一个Message实体类,某 ...
- 体积雾 global fog unity 及改进
https://github.com/keijiro/KinoFog lighting box 2.7.2 halfspace fog 相机位于一个位置 这个位置可以在fog volumn里面或者外面 ...