C++ Scoket的升级版(多态的运用)
//Socket报文发送c++升级版
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include"des.h" //协议类
class SCK_HANDLE{
public:
SCK_HANDLE(){
memset(buf, , sizeof(buf));
buflen = ;
}
char buf[];
int buflen;
}; //框架类
class SocketFrame{
public:
virtual int cltSocketSend(unsigned char *buf/*in*/) = ;
virtual int cltSocketRev(unsigned char **buf/*out*/, int *buflen/*out*/) = ;
virtual ~SocketFrame(){}
}; //加密框架类
class Encrypt{
public:
//加密
virtual int DesEncSocket(char *plainstr/*in*/, int plainlen, char **cryptstr/*out*/, int *cryptlen) = ;
//解密
virtual int DesDecSocket(char *cryptstr/*in*/, int cryptlen, char **plainstr/*out*/, int *plainlen) = ;
}; //我自己的加密类
class MyEncrypt :public Encrypt{
public:
//加密
virtual int DesEncSocket(char *plainstr/*in*/, int plainlen, char **cryptstr/*out*/, int *cryptlen){
int ERRO_MSG = ;
if (plainstr == NULL || cryptstr == NULL || cryptlen==NULL)
{
ERRO_MSG = ;
cout << "加密参数列表为空!" << endl;
return ERRO_MSG;
}
//des密文比明文长,但是密文最多比明文多8个字节(所以我取10个足够)
*cryptstr = (char *)malloc((sizeof(char)*plainlen)+);
if (cryptstr==NULL)
{
ERRO_MSG = ;
cout << "加密函数分配输出内存失败!" << endl;
return ERRO_MSG;
}
int ret= DesEnc((unsigned char *)plainstr, plainlen, (unsigned char *)*cryptstr, cryptlen);
if (ret!=)
{
ERRO_MSG = ;
cout << "des加密函数执行失败!" << endl;
return ERRO_MSG;
}
return ERRO_MSG;
}
//解密
virtual int DesDecSocket(char *cryptstr/*in*/, int cryptlen, char **plainstr/*out*/, int *plainlen){
int ERRO_MSG = ;
if (plainstr == NULL || cryptstr == NULL || plainlen == NULL)
{
ERRO_MSG = ;
cout << "解密参数列表为空!" << endl;
return ERRO_MSG;
}
//分配内存空间(des密文只可能比明文长)
*plainstr = (char *)malloc((sizeof(char)*cryptlen));
if (plainstr==NULL)
{
ERRO_MSG = ;
cout << "分配输出内存失败!" << endl;
return ERRO_MSG;
}
int ret = DesDec((unsigned char *)cryptstr, cryptlen, (unsigned char *)*plainstr, plainlen);
if (ret != )
{
ERRO_MSG = ;
cout << "des解密函数执行失败!" << endl;
return ERRO_MSG;
}
return ERRO_MSG;
}
}; //第三方的类
class MySocket :public SocketFrame{
public:
MySocket(){
//分配内存,因为handle贯穿整个报文发送,所以不适合栈内存
handle = new SCK_HANDLE();
mye = new MyEncrypt();
}
MySocket(MySocket &msp/*in*/){
cout << "不允许使用拷贝够咱函数" << endl;
//以防不备
handle = new SCK_HANDLE();
handle->buflen = msp.handle->buflen;
strcpy(handle->buf, msp.handle->buf); }
//接收报文
virtual int cltSocketSend(unsigned char *buf/*in*/){
int ERRO_MSG = ;
if (buf==NULL)
{
ERRO_MSG = ;
cout << "接收报文的值为空!" << endl;
return ERRO_MSG;
}
if (handle==NULL)
{
ERRO_MSG = ;
cout << "报文对象没有初始化!" << endl;
return ERRO_MSG;
}
//报文加密
int tempt = strlen((const char *)buf) + ;
//准备密文接收缓存
unsigned char *tempstr = NULL;
int ret= mye->DesEncSocket((char *)buf, tempt, (char **)&tempstr, &tempt);
if (ret!=)
{
ERRO_MSG = ;
cout << "密文加密失败" << endl;
return ERRO_MSG;
}
//将密文放进报文结构体
strcpy(handle->buf, (const char*)tempstr);
//释放内存
if (tempstr!=NULL)
{
free(tempstr);
tempstr = NULL;
}
handle->buflen = tempt;
return ERRO_MSG;
}
//发送报文
virtual int cltSocketRev(unsigned char **buf/*out*/, int *buflen/*out*/){
int ERRO_MSG = ;
if (buf == NULL || buflen==NULL)
{
ERRO_MSG = ;
cout << "业务接受报文数组不存在或者业务接受报文长度变量不存在!" << endl;
return ERRO_MSG;
}
if (handle == NULL)
{
ERRO_MSG = ;
cout << "报文对象没有初始化!" << endl;
return ERRO_MSG;
}
//解密报文
int ret = mye->DesDecSocket(handle->buf, handle->buflen, (char **)buf, buflen);
if (ret!=)
{
ERRO_MSG = ;
cout << "报文对象密文解密失败!" << endl;
return ERRO_MSG;
}
return ERRO_MSG;
}
~MySocket(){
if (handle!=NULL)
{
delete handle;
handle = NULL;
}
if (mye!=NULL)
{
delete mye;
mye = NULL;
}
}
private:
SCK_HANDLE *handle;
MyEncrypt *mye;
}; //操作业务类
class ProtectSocket{
public:
void Setsp(SocketFrame &pin){
sp = &pin;
}
void ProtectA();
~ProtectSocket(){
}
private:
SocketFrame *sp;
}; void ProtectSocket::ProtectA(){
unsigned char newbuf1[] = "我是发送的报文:dddddddddddddd"; //发送报文
int ret = ;
ret = sp->cltSocketSend(newbuf1);
if (ret!=)
{
cout << "报文发送出错!" << endl;
}
unsigned char *newbuf2 = NULL;
int newlen2 = ;
//接受报文
ret = sp->cltSocketRev(&newbuf2, &newlen2);
if (ret!=)
{
cout << "报文接受出错!" << endl;
}
//释放内存
if (newbuf2!=NULL)
{
free(newbuf2);
newbuf2 = NULL;
}
} void main(){
//new 第三方类对象
SocketFrame *sp = new MySocket();
ProtectSocket *psc = new ProtectSocket();
psc->Setsp(*sp);
psc->ProtectA();
delete psc;
psc = NULL;
delete sp;
sp = NULL;
system("pause");
}
C++ Scoket的升级版(多态的运用)的更多相关文章
- 线程间通信--生产者消费者 升级版JDK5
import java.util.concurrent.locks.*; /*1.新的解锁,上锁操作,据说是jdk5.0升级版,以前的枷锁,解锁都是隐藏的,默认的,现在变成显式 2.新的异常处理方式 ...
- day 27 多态 接口 类方法 静态方法 hashlib 摘要算法模块
# 多态的理解:# Python 天生自带多态# 鸭子类型 list 和 tuple 就是一对鸭子类型 很像但是没有继承关系## 而其他的类型 上传参数或者打印参数的时候 必须是指定的数据类型# -- ...
- 七:Java之封装、抽象、多态和继承
本文章介绍了关于Java中的面向对象封装.抽象.继承.多态特点 Java面向对象主要有四大特性:封装.抽象.继承和多态. 一.封装 封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的总体, ...
- day24:多态&魔术方法__new__&单态模式
目录 1.多态 2.__new__魔术方法 2.1 关于魔术方法__new__ 2.2 基本语法 2.3 __new__ 触发时机快于构造方法 2.4 __new__ 和 __init__ 参数一一对 ...
- Learn day7 继承(单、多、菱形)\多态\魔术方法\装饰器\异常
1.继承 1.1 单继承# ### 继承 """ (1) 单继承 (2) 多继承 至少2个类,子类和父类 一个类继承另外一个类,当前类是子类 (衍生类) 被继承的这个类是 ...
- Java中的多态
1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal {public abstract void Say();} 子类: public class ...
- C# 工厂模式+虚方法(接口、抽象方法)实现多态
面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态. 实例说明: 业务需求:实现一个打开文件的控制台程序的d ...
- C#非常重要基础之多态
前几天看了一位同志的博客,写的是关于他自己去支付宝面试的经历.过程大体是这样的:问答的时候,前面部分,作者都应答如流,说起自己经验如何之丰富,最后面试官问了作者一个问题:请简述多态的概念和作用.结果这 ...
- C++多态详解
多态是面向对象的程序设计的关键技术.多态:调用同一个函数名,可以根据需要但实现不同的功能.多态体现在两个方面,我们以前学过的编译时的多态性(函数重载)和现在我们这一章将要学习的运行时的多态性(虚函数) ...
随机推荐
- JCheckBox使用示例
// 初始化 JCheckBox chk=new JCheckBox("XXX"); // 选择 chk.setSelected(true); // 判断选择状态 chk.isSe ...
- java中Xml、json之间的相互转换
旁白: 最近关于xml与json之间的转换都搞蒙了,这里写一个demo,以后备用. 正题: project格式是: jar包是一个一个检出来的,还算干净了. 代码: 工具类: package exer ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何在初始化的时候写入参数
最常见的是定义一个全局变量,然后跟对应的变量绑定,比如我定义了一个SINT型的变量ControlWord 数值是8,定义好之后编译一下,可以发现PLC程序中或多出来这个变量(MAIN.ControlW ...
- vue - v-text 和 v-html
1.官方有了{{data}}绑定数据了,为啥还要v-text 因为网络问题,可以我们会卡到看“{{}}”,很尴尬吧!!! => 因此推荐用v-text 2. v-html是啥? 能吃吗 , v- ...
- DNS使用的是TCP协议还是UDP协议简析
DNS使用的是TCP协议还是UDP协议简析 DNS同时占用UDP和TCP端口53是公认的,这种单个应用协议同时使用两种传输协议的情况在TCP/IP栈也算是个另类.但很少有人知道DNS分别在什么情况 ...
- JavaScript | 数据属性与访问器属性
属性类型 数据属性 - 包含一个数据值的位置,可以读取和写入值 [writable] 是否能修改属性的值 true [enumerable] 是否通过for in 循环返回属性(是否可以被枚举) tr ...
- Mybatis <if>标签
格式:<if test=""> sql语句 </if> <select id="selectByName" resultType= ...
- Pygame制作答题类游戏的实现
代码地址如下:http://www.demodashi.com/demo/13495.html 概述 个人比较喜欢玩这些答题类的游戏,在这类的游戏中其实存在着一些冷知识在里面.练习pygame的过程中 ...
- JiaThis™“分享到”侧栏代码
风格:迷你: 猜你喜欢: 开启 使用说明: 复制并粘贴下面的JS代码,放到您的网页,可以在<body>和</body>的之间网页的任意位置放置.如果您的网站使用的模板, ...
- 浅析C#中 ConcurrentDictionary的实现
简单画了一张图 (灵魂画手 →_→) 如图 ConcurrentDictionary 其中有个tables 对象主要存储,而这个 tables 是一个 很多区块的 数组 ,每个区块 又是一个node的 ...