Openssl数据安全传输平台004:套接字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

  1. 由于几乎所有的API都有参数int *connfd,所以直接将其设置一个私有的成员变量,并且从所有的API参数列表中移除。
  2. 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 客户端代码实现

在这里插入图片描述

完整代码参考代码仓库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/144737.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【试题040】多个逻辑或例题2

1.题目:设int n0;,执行表达式n ||(n-1) ||(n0)||(n1)||(n2)后n的值是 ? 2.代码解析: 逻辑或 || 运算符是一个短路运算符,它从左到右依次计算表达式,如果遇到一个为真(非零)的值&am…

【Spring Boot 源码学习】HttpEncodingAutoConfiguration 详解

Spring Boot 源码学习系列 HttpEncodingAutoConfiguration 详解 引言往期内容主要内容1. CharacterEncodingFilter2. HttpEncodingAutoConfiguration2.1 加载自动配置组件2.2 过滤自动配置组件2.2.1 涉及注解2.2.2 characterEncodingFilter 方法2.2.3 localeCharsetMappingsCus…

四、网络请求与路由

一、网络请求 1、Axios请求 Axios是一个基于promise的网络请求库 (1)安装 npm install --save axios(2)引入 import axios from "axios"全局引入 import axios from "axios" import { createApp } from …

STM32,我想看单片机上的外设时钟,我怎么看?

一:在工程中加入rcc文件 首先需要加载我们的时钟函数的文件 stm32f10x_rcc.h 和 stm32f10x_rcc.c 文件 二:查看文件 在h头文件 尾部,有我们这个总线的函数 在函数体内,有我们这个宏定义的 外设时钟,我们拿就行了 APB2_…

多版本并发控制MVCC

什么是MVCC MVCC (Multiversion Concurrency Control),多版本并发控制。顾名思义,MVCC 是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换言之,…

观察者模式-对象间的联动

有个商城小程序,用户希望当有新品上市的时候能通知他们。这样用户就可以不要时刻盯着小程序了。在这个场景中,用户向小程序订阅了一个服务——发送新品短信。小程序在有新品上线时负责向订阅客户发出这个消息。 这就是发布-订阅模式,也称观察…

为什么不建议使用Python自带的logging?

B站|公众号:啥都会一点的研究生 包括我在内的大多数人,当编写小型脚本时,习惯使用print来debug,肥肠方便,这没问题,但随着代码不断完善,日志功能一定是不可或缺的,极大程度方便问题…

2023-10-17 LeetCode每日一题(倍数求和)

2023-10-17每日一题 一、题目编号 2652. 倍数求和二、题目链接 点击跳转到题目位置 三、题目描述 给你一个正整数 n ,请你计算在 [1,n] 范围内能被 3、5、7 整除的所有整数之和。 返回一个整数,用于表示给定范围内所有满足约束条件的数…

10_集成学习方法:随机森林、Boosting

文章目录 1 集成学习(Ensemble Learning)1.1 集成学习1.2 Why need Ensemble Learning?1.3 Bagging方法 2 随机森林(Random Forest)2.1 随机森林的优点2.2 随机森林算法案例2.3 随机森林的思考(--->提升学习) 3 随机森林(RF&a…

经典链表问题:解析链表中的关键挑战

这里写目录标题 公共子节点采用集合或者哈希采用栈拼接两个字符串差和双指针 旋转链表 公共子节点 例如这样一道题:给定两个链表,找出它们的第一个公共节点。 具体的题目描述我们来看看牛客的一道题: 这里我们有四种解决办法: …

跟随光标圆形文本旋转

今天给大家带来的是光标变成圆形字符串环绕 不多说先上效果图 原理呢,也很简单 就是先把文本 <h2>大威天龙 - 世尊地藏 - 般若诸佛 - 般若巴嘛哄 -</h2>然后使用js将文本处理成每个字符一个span,并且让他们旋转 let text document.querySelector(h2)text.innerH…

第 368 场 LeetCode 周赛题解

A 元素和最小的山形三元组 I 前后缀操作&#xff1a;求出前后缀上的最小值数组&#xff0c;然后枚举 j j j class Solution { public:int minimumSum(vector<int> &nums) {int n nums.size();vector<int> l(n), r(n);//l[i]min{nums[0],...,nums[i]}, r[i]mi…