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模式的更多相关文章

  1. 企业信息系统集成框架(设计思路)C++模式

    设计要求: 1.企业信息系统框架.第三方产品通过接口层进行分层. 2.企业信息系统框架如何自由的继承第三方产品:通过一个抽象类.(软件设计要求:模块要求松,接口要求紧). 设计步骤: 1.报文的接受与 ...

  2. App 自动化框架设计思路

    最近在整理和学习Appium+Java 自动化框架,对APP自动化框架的部分设想参考了一些文章,先进行整理下: 框架的思路一: 思考引入:https://www.cnblogs.com/yunfeio ...

  3. Mybatis学习之自定义持久层框架(二) 自定义持久层框架设计思路

    前言 上一篇文章讲到了JDBC的基本用法及其问题所在,并提出了使用Mybatis的好处,那么今天这篇文章就来说一下该如何设计一个类似Mybatis这样的持久层框架(暂时只讲思路,具体的代码编写工作从下 ...

  4. Javascript框架设计思路图

    这个系列的随笔都是关于Javascript框架设计一书的读书笔记(作者是司徒正美),不是本人原创!!! 一.简介: 1.市面上主流的JS框架,大多数是由一个个模块组合而成,模块化是大多数让软件所遵循的 ...

  5. 开源项目CIIP(企业信息管理系统框架).2018.0904版更新介绍

    源码: https://github.com/tylike/CIIP https://gitee.com/ciip/CIIP 一,CIIP的目标是什么? 更加简单,快速的建立信息类管理系统.让实施人员 ...

  6. RPC框架设计思路

    RPC是指远程过程调用 1.要解决通讯的问题,主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输.连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远 ...

  7. 开源项目CIIP(企业信息管理系统框架).2018.1.0910版更新介绍-上周工作总结

    又狂撸了一周的代码.简化了0904版本的多数操作. 上一次更新时,总共需要10步,这次简化成3步.嗯嗯,自我感觉不错. 重要的:在创建项目时,可以选择常用模块啦! 第一步:启动CIIP.Designe ...

  8. Socket开发框架之框架设计及分析

    虽然在APP应用.Web应用.Winform应用等大趋势下,越来越多的企业趋向于这些应用系统开发,但是Socket的应用在某些场合是很必要的,如一些停车场终端设备的接入,农业或者水利.压力监测方面的设 ...

  9. Sizzle源码分析:一 设计思路

    一.前言 DOM选择器(Sizzle)是jQuery框架中非常重要的一部分,在H5还没有流行起来的时候,jQuery为我们提供了一个简洁,方便,高效的DOM操作模式,成为那个时代的经典.虽然现在Vue ...

随机推荐

  1. [BZOJ1003](ZJOI 2006) 物流运输trans

    [题目描述] 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟 ...

  2. mqtt 协议之 PINGREQ, PINGRESP

    mqtt 协议里最简单的是 ping 协议吧 (心跳包), ping 协议是已连接的客户端发往服务端, 告诉服务端,我还"活着" PINGREQ - PING request fi ...

  3. What happens when a SQL Query runs?

    Posted by Padma Chitturi in Uncategorized. Leave a Comment Hi Folks, It has been such a long time th ...

  4. Android内存优化14 内存泄漏常见情况5 特殊对象造成的内存泄漏 WebView内存泄漏

    WebView造成内存泄露 关于WebView的内存泄露,因为WebView在加载网页后会长期占用内存而不能被释放,因此我们在Activity销毁后要调用它的destory()方法来销毁它以释放内存. ...

  5. 添加javabrowser 支持中文

    //搜网上的javabrowser都不支持中文在线修改保存,且文件名包含中文.修改如下 <%@page import="java.util.*, java.net.*, java.te ...

  6. 万里长征第二步——django个人博客(第五步 ——配置后台admin)

    在urls.py文件中配置admin路径 from django.conf.urls import url from django.contrib import admin from blog.vie ...

  7. 使用nsswitch控制linux dns解析顺序

    参考:1.DNS原理入门参考:http://www.ruanyifeng.com/blog/2016/06/dns.html 2.http://cn.linux.vbird.org/linux_ser ...

  8. SQLAlchemy中filter()和filter_by()的区别

    1.filter引用列名时,使用“类名.属性名”的方式,比较使用两个等号“==” 2.filter_by引用列名时,使用“属性名”,比较使用一个等号“=” 3.在使用多条件匹配的时候,filter需要 ...

  9. PowerShell中的一个switch的例子

    在这个例子中, 应该注意 Switch语句里对数字范围条件的使用 break的使用 字符串的拼接 数组的声明   ) foreach ($element in $array) { switch($el ...

  10. 什么是JSONP?

    一.先说说JSONP是怎么产生的: 其实网上关于JSONP的讲解有很多,但却千篇一律,而且云里雾里,对于很多刚接触的人来讲理解起来有些困难,小可不才,试着用自己的方式来阐释一下这个问题,看看是否有帮助 ...