//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");
}

最新文章

  1. 【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】
  2. javascript各种宽高
  3. js post提交
  4. 【MVC】自定义Scaffold Template
  5. Web启动服务器上的某一个服务
  6. Struts2的输入校验(2)——客户端校验
  7. PHP开发入行真功夫 三扬科技
  8. careercup-位操作5.1
  9. google code 上传源码
  10. c++给数组赋值
  11. Entity Framework快速入门--IQueryable与IEnumberable的区别
  12. 命令导入导出oracle库
  13. [特别公告]RDIFramework.NET微信公众号迁移通知
  14. switch case语句中能否作用在String,long上
  15. UVA10341 Solve It
  16. luogu Eat the Trees
  17. 【Java】 大话数据结构(6) 栈的顺序与链式存储
  18. java SoftReference WeakReference
  19. 第三百八十二节,Django+Xadmin打造上线标准的在线教育平台—xadmin管理员详情页面布局,导航图标设置
  20. 论文笔记 CVPR-2014 DeepReID Deep filter pairing neural network for person re-identification

热门文章

  1. 深入理解C#中的泛型(一)
  2. ajax同步和异步
  3. 【MVC+MySQL+EntityFramework】查询性能优化笔记
  4. Java集合-Map接口相关操作方法
  5. SpringMVC学习小结
  6. MAC OS X 10.8 操作远程SSH服务器 + 无密码输入使用SSH服务器
  7. HTML-HTML5+CSS3权威指南阅读(二、让IE支持HTML5标签及对CSS3 Media Query的兼容)
  8. angular过滤器使用 自定义过滤器
  9. django如何修改开发服务器的端口
  10. JSP应用开发 -------- 电纸书(未完待续)