Openssl数据安全传输平台004:Socket C-API封装为C++类 / 服务端及客户端代码框架和实现
文章目录
- 0. 代码仓库
- 1. 客户端C API
- 2. 客户端C API的封装分析
- 2.1 sckClient_init()和sckClient_destroy()
- 2.2 sckClient_connect
- 2.3 sckClient_closeconn()
- 2.4 sckClient_send()
- 2.5 sckClient_rev()
- 2.6 sck_FreeMem
- 3. 客户端C++ API
- 4. 服务端C API
- 5. 服务端C++
- 6. 客户端和服务端代码框架
- 7.代码实现
- 7.1 服务端代码实现
- 7.2 客户端代码实现
- 完整代码参考代码仓库
0. 代码仓库
https://github.com/Chufeng-Jiang/OpenSSL_Secure_Data_Transmission_Platform
1. 客户端C API
// 客户端
// C API
int sckClient_init();
/* 客户端 连接服务器 */
int sckClient_connect(char *ip, int port, int connecttime, int *connfd);
/* 客户端 关闭和服务端的连接 */
int sckClient_closeconn(int connfd);
/* 客户端 发送报文 */
int sckClient_send(int connfd, int sendtime, unsigned char *data, int datalen);
/* 客户端 接受报文 */
int sckClient_rev(int connfd, int revtime, unsigned char **out, int *outlen); //1
/* 释放内存 */
int sck_FreeMem(void **buf);
/* 客户端 释放 */
int sckClient_destroy();
2. 客户端C API的封装分析
2.1 sckClient_init()和sckClient_destroy()
int sckClient_init(); 可以使用构造函数代替
TcpSocket();
TcpSocket(int fd);
~TcpSocket();
2.2 sckClient_connect
- 由于几乎所有的API都有参数
int *connfd,所以直接将其设置一个私有的成员变量,并且从所有的API参数列表中移除。- C++使用string来拷贝字符串比char方便
/* 客户端 连接服务器 */
int sckClient_connect (char *ip, int port, int connecttime, int * );connfd
int conectToHost(string ip, unsigned short port, int connecttime)int m_connfd;
2.3 sckClient_closeconn()
/* 客户端 关闭和服务端的连接 */
int sckClient_closeconn(int connfd );
int disConnect();
2.4 sckClient_send()
unsigned char *data,int datalen是要发送的数据,直接修改为string sendMsg
/* 客户端 发送报文 */
int sckClient_send(int connfd, int sendtime, unsigned char *data, int datalen);
int sendMsg(string sendMsg, int sendtime = 10000)
2.5 sckClient_rev()
/* 客户端 接受报文 */
int sckClient_rev(int connfd, int revtime, unsigned char **out, int *outlen);
string recvMsg(int timeout)
2.6 sck_FreeMem
/* 释放内存 */
int sck_FreeMem(void **buf);
3. 客户端C++ API
// 创建TcpSocket对象 == 一个连接, 这个对象就可以和服务器通信了, 多个连接需要创建多个这样的对象class TcpSocket
{
public:TcpSocket();TcpSocket(int fd);~TcpSocket();/* 客户端 连接服务器 */int conectToHost(string ip, unsigned short port, int connecttime);/* 客户端 关闭和服务端的连接 */int disConnect();/* 客户端 发送报文 */int sendMsg(string sendMsg, int sendtime = 10000);/* 客户端 接受报文 */string recvMsg(int timeout);private:int m_connfd;
}
4. 服务端C API
// 服务器端
/* 服务器端初始化 */
int sckServer_init(int port, int *listenfd);
int sckServer_accept(int listenfd, int timeout, int *connfd);
/* 服务器端发送报文 */
int sckServer_send(int connfd, int timeout, unsigned char *data, int datalen);
/* 服务器端端接受报文 */
int sckServer_rev(int connfd, int timeout, unsigned char **out, int *outlen); //1
int sckServer_close(int connfd);
/* 服务器端环境释放 */
int sckServer_destroy();
5. 服务端C++
// 这个类不能用, 因为只能和一个客户端建立连接
class TcpServer
{
public:// 初始化监听的套接字: 创建, 绑定, 监听TcpServer();~TcpServer(); // 在这里边关闭监听的fdint acceptConn(int timeout);/* 服务器 发送报文 */int sendMsg(string sendMsg, int sendtime = 10000);/* 服务器 接受报文 */string recvMsg(int timeout); int disConnect(); // 和客户端断开连接
private:int m_lfd; // 监听的文件描述符int m_connfd; // 通信的文件描述符
}
6. 客户端和服务端代码框架

7.代码实现
7.1 服务端代码实现

7.2 客户端代码实现

完整代码参考代码仓库
相关文章:
Openssl数据安全传输平台004:Socket C-API封装为C++类 / 服务端及客户端代码框架和实现
文章目录 0. 代码仓库1. 客户端C API2. 客户端C API的封装分析2.1 sckClient_init()和sckClient_destroy()2.2 sckClient_connect2.3 sckClient_closeconn()2.4 sckClient_send()2.5 sckClient_rev()2.6 sck_FreeMem 3. 客户端C API4. 服务端C API5. 服务端C6. 客户端和服务端代…...
网络协议--Traceroute程序
8.1 引言 由Van Jacobson编写的Traceroute程序是一个能更深入探索TCP/IP协议的方便可用的工具。尽管不能保证从源端发往目的端的两份连续的IP数据报具有相同的路由,但是大多数情况下是这样的。Traceroute程序可以让我们看到IP数据报从一台主机传到另一台主机所经过…...
Centos磁盘问题小纪
场景说明 放个windows的图片镇楼,在给一个centos的来说明问题,咋了,好好的系统,啥也不能干了 来先上一波命令分析下问题 查看挂载 mount 重新挂载数据 mount -o remount, rw / 查看磁盘 df -h 查看分区挂载详情 rw读写权限 mount …...
计算机网络第三章习题
1.假定1km长的CSMA/CD网络的数据率为1Gb/s。设信号在网络上的传播 速率为200000km/s。求能够使用此协议的最短帧长. 问题刨析: 逻辑链: 最短帧长数据传输率x争用期2τ(2倍端到端所需要的时间) 题目已经给出数据率为1Gb/s,所以我们要知道争用期2τ是多少. 端到端所需要的时间信…...
Layui弹出层关闭后页面自动刷新的用法以及建议
首先在HTML中定义一个查询按钮 <div class"layui-inline"><button class"layui-btn" id"searchBtn" lay-submit lay-filter"data-search-btn" > <i class"layui-icon layui-icon-search">查询</i&…...
PHP 在线考试管理系统mysql数据库web结构layUI布局apache计算机软件工程网页wamp
一、源码特点 PHP 在线考试管理系统是一套完善的web设计系统 layUI技术布局 ,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 PHP 在线考试系统1 代码 https://download.csdn.net/download/qq_41…...
【茫茫架构路】1. Class File字节码文件解析
本文所有内容的JDK版本为 OpenJDK 11 JDK11 Class File官方说明。 Java解析字节码文件源码参考,以下为部分字节码解析源码展示。 public ClassFile(DataInputStream in) {try {//magic: 0xCAFEBABEthis.magic ClassReader.readInt(in);System.out.println("m…...
Golang笔记
01 = 和 := 的区别? 前者是赋值变量,后者是定义变量 02 指针的作用 指针指向变量的地址,在64位机器上占8个字节 【1 字节(Byte)= 8 位(bit) 1 千字节(KB,Kilobyte)= 1,024 字节(2^10 字节)】 作用 取址然后取值swap函数 交换变量的值指针接收器来改变结构体里面…...
在Linux上安装RStudio工具并实现本地远程访问【内网穿透】
文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE,并通过 Web 浏览器进行访问…...
leetcode 128. 最长连续序列
2023.10.23 本题思路:遍历所有元素,对当前元素num进行查找:有无元素(num1)、有无元素(num2)......若有则继续查找下去,同时记录最大序列长度,无则遍历下一个元素。 考虑到数组中可能有重复元素需要去重,并且…...
k8s-----4、yaml文件,做资源编排和资源对象部署
yaml文件 1、YAML 文件概述2、YAML 文件书写格式3、资源清单描述方法4、yaml文件编写4.1 没有真正部署资源的过程4.2 资源已经存在的时候 5、yaml文件中必须存在的属性 1、YAML 文件概述 k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML࿰…...
proteus中仿真arduino的水位测试传感器
一、原理介绍 我们这里使用的水位传感器,只能说是一个小实验用途的水位传感器。我们首先上图 如上图所示,线没有连接,传感器由许5对裸露在外的铜线片作为传感部分,当浸入水中时这些铜线片会被水桥接。 这些被水连接起来的铜线&a…...
设计模式-单例模式 (Singleton)
单例模式 (Singleton) 单例模式是一种创建型设计模式,它确保类只有一个实例,并提供了一种访问该实例的全局方法。这种模式有助于确保系统中的某些组件只有一个实例,并提供了一种方便的方法来访问该实例。 1、单例类只…...
程序包org.apache.ibatis.mapping不存在 符号找不到
找不到符号 符号: 类 Cursor和程序包org.apache.ibatis.mapping不存在 在idea中没有错误,但是在linux编辑时报了这两个错误,之前有遇见过符号找不到的问题, 当时的问题是编译的import xxx.xxx.xxx.* 识别不成功过,将*改为…...
Microsoft Edge浏览器中使用免费的ChatGPT
一、双击打开浏览器 找到:扩展,打开 二、打开Microsoft Edge加载项 三、Move tab新标签 获取免费ChatGPT 四、启用Move tab。启用ChatGPT。 扩展 管理扩展 启用 五、新建标签页,使用GPT 六、使用举例 提问 GPT回复...
Python 框架学习 Django篇 (五) Session与Token认证
我们前面经过数据库的学习已经基本了解了怎么接受前端发过来的请求,并处理后返回数据实现了一个基本的登录登出效果,但是存在一个问题,我们是将所有的请求都直接处理了,并没有去检查是否为已经登录的管理员发送的,如果…...
cocos creator 小游戏允许他人访问本地项目
需求背景: 发版成微信小游戏前,需要策划介入体验。不上传微信体验版本 实现: 1.发布平台选择web桌面端 2.构建完成后点击运行从浏览器上获取本地的运行地址 3.winR ——》 cmd 控制台 输入 ipconfig 找到IPv4地址,替换本地部分 …...
分布式存储 vs. 全闪集中式存储:金融数据仓库场景下的性能对比
作者:深耕行业的 SmartX 金融团队 张德敏 近年来随着金融行业的高速发展,经营决策者及监管机构对信息时效性的要求越来越高,科技部门面临诸多挑战。例如,不少金融机构使用数仓业务系统,为公司高层提供日常经营报表&am…...
RHCE---搭建博客网站
一.实验要求: Server-NFS-DNS主机配置NFS服务器,将博客网站资源文件共享给Server-web主机,Server-NFS-DNS主机配置DNS Server-web主机配置web服务,通过域名www.openlab.com可以访问到自建的博客网站 二.准备工作 创建两台虚拟机…...
Spring中方法拦截器
一、MethodInterceptor 在动态代理中要想添加一个额外功能,只要去实现MethodBeforeAdvice这个接口就行了,但是实现了这个接口的额外功能只能运行在目标类执行之前,如果是想在目标类执行之后呢?那这个需求就完成不了,所…...
3大创新技术:重构Android设备标识获取的新范式
3大创新技术:重构Android设备标识获取的新范式 【免费下载链接】Android_CN_OAID 安卓设备唯一标识解决方案,可替代移动安全联盟(MSA)统一 SDK 闭源方案。包括国内手机厂商的开放匿名标识(OAID)、海外手机平…...
3步打造你的云端Windows 12:无需安装,浏览器直接体验
3步打造你的云端Windows 12:无需安装,浏览器直接体验 【免费下载链接】win12 Windows 12 网页版,在线体验 点击下面的链接在线体验 项目地址: https://gitcode.com/gh_mirrors/wi/win12 想要在浏览器中体验最新的Windows系统界面吗&am…...
Z-Image-Turbo-辉夜巫女部署案例:A10G显卡上实现<2s单图生成响应时间
Z-Image-Turbo-辉夜巫女部署案例:A10G显卡上实现<2s单图生成响应时间 1. 引言:当二次元创作遇上极速生成 想象一下,你脑海中浮现出一个“辉夜巫女”的绝美画面——银发、红瞳、身着传统巫女服,背景是飘落的樱花。在传统的工作…...
易语言+Miniblink实战:用HTML5打造炫酷UI界面(附完整代码)
易语言Miniblink实战:用HTML5打造炫酷UI界面(附完整代码) 在传统桌面应用开发中,易语言因其简单易学的特性广受中文开发者喜爱。然而随着用户对界面美观度和交互体验要求的提升,原生支持库的局限性逐渐显现。本文将带你…...
揭秘DXVK:Vulkan驱动的Direct3D翻译层革命
揭秘DXVK:Vulkan驱动的Direct3D翻译层革命 【免费下载链接】dxvk Vulkan-based implementation of D3D8, 9, 10 and 11 for Linux / Wine 项目地址: https://gitcode.com/gh_mirrors/dx/dxvk DXVK(Direct3D to Vulkan)是一款革命性的开…...
H5年会抽奖实战:手机号与微信头像双模式实现
1. 为什么选择H5实现年会抽奖 每到年底,企业年会就成了大家最期待的活动之一。作为技术人,我们总想用些新花样让抽奖环节更有趣。去年我负责公司年会抽奖系统开发时,就遇到了一个典型需求:既要支持传统的手机号抽奖,又…...
KingbaseES元数据查询实战:一键获取表结构全貌(含字段、约束与注释)
1. 为什么需要一键获取表结构全貌? 在日常数据库管理和开发工作中,我们经常需要快速了解某个表的具体结构。想象一下,你刚接手一个新项目,数据库里有上百张表,每张表都有几十个字段。这时候如果一个个字段去查…...
5分钟快速上手OHIF-Viewers:零基础搭建医学影像DICOMweb阅片环境
5分钟快速上手OHIF-Viewers:零基础搭建医学影像DICOMweb阅片环境 医学影像数字化阅片已成为现代医疗信息化的核心需求。对于刚接触医疗IT的临床转技术人员或医疗信息化初学者而言,如何快速搭建一个符合DICOMweb标准的阅片环境常常令人望而生畏。本文将带…...
零样本全色锐化实战:基于CrossDiff扩散模型的卫星图像融合保姆级教程(附PyTorch代码)
零样本全色锐化实战:基于CrossDiff扩散模型的卫星图像融合保姆级教程(附PyTorch代码) 当低分辨率的多光谱图像遇上高分辨率的全色图像,如何让它们优势互补?全色锐化技术正是解决这一问题的关键。不同于传统监督学习方法…...
倒计时72小时|奇点大会闭门报告流出:大模型工具调用正进入“确定性调度”时代,错过将落后至少18个月
第一章:2026奇点智能技术大会:大模型工具调用 2026奇点智能技术大会(https://ml-summit.org) 工具调用范式的根本性跃迁 本届大会首次将大模型的工具调用(Tool Calling)从辅助能力升维为原生架构层能力。主流框架如Llama-3.5-To…...
