Openssl数据安全传输平台004:Socket C-API封装为C++类 / 服务端及客户端代码框架和实现

文章目录

  • [0. 代码仓库](#0. 代码仓库)
  • [1. 客户端C API](#1. 客户端C API)
  • [2. 客户端C API的封装分析](#2. 客户端C API的封装分析)
    • [2.1 sckClient_init()和sckClient_destroy()](#2.1 sckClient_init()和sckClient_destroy())
    • [2.2 sckClient_connect](#2.2 sckClient_connect)
    • [2.3 sckClient_closeconn()](#2.3 sckClient_closeconn())
    • [2.4 sckClient_send()](#2.4 sckClient_send())
    • [2.5 sckClient_rev()](#2.5 sckClient_rev())
    • [2.6 sck_FreeMem](#2.6 sck_FreeMem)
  • [3. 客户端C++ API](#3. 客户端C++ API)
  • [4. 服务端C API](#4. 服务端C API)
  • [5. 服务端C++](#5. 服务端C++)
  • [6. 客户端和服务端代码框架](#6. 客户端和服务端代码框架)
  • 7.代码实现
    • [7.1 服务端代码实现](#7.1 服务端代码实现)
    • [7.2 客户端代码实现](#7.2 客户端代码实现)
  • 完整代码参考代码仓库

0. 代码仓库

https://github.com/Chufeng-Jiang/OpenSSL_Secure_Data_Transmission_Platform

1. 客户端C API

python 复制代码
// 客户端
// 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(); 可以使用构造函数代替

python 复制代码
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 );

python 复制代码
int conectToHost(string ip, unsigned short port, int connecttime)

int m_connfd;

2.3 sckClient_closeconn()

/* 客户端 关闭和服务端的连接 */

int sckClient_closeconn(int connfd );

python 复制代码
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);

python 复制代码
int sendMsg(string sendMsg, int sendtime = 10000)

2.5 sckClient_rev()

/* 客户端 接受报文 */

int sckClient_rev(int connfd, int revtime, unsigned char **out, int *outlen);

python 复制代码
string recvMsg(int timeout)

2.6 sck_FreeMem

/* 释放内存 */
int sck_FreeMem(void **buf);

3. 客户端C++ API

cpp 复制代码
// 创建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

python 复制代码
// 服务器端
/* 服务器端初始化 */
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++

cpp 复制代码
// 这个类不能用, 因为只能和一个客户端建立连接
class TcpServer
{
public:
    // 初始化监听的套接字: 创建, 绑定, 监听
    TcpServer();
    ~TcpServer();    // 在这里边关闭监听的fd

    int 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 客户端代码实现

完整代码参考代码仓库

相关推荐
wengqidaifeng6 分钟前
备战蓝桥杯----C/C++组 (三)算法讲解前言
c语言·c++·蓝桥杯
森G15 分钟前
30、QStandardItemModel 和 QTableView---------Model/View模型视图
c++·qt
maxmaxma18 分钟前
ROS2机器人少年创客营:Python第二课
c++·python·机器人
山栀shanzhi25 分钟前
FFmpeg 实战:RGB 裸流编码成 MP4,全流程详解(含源码
c++·ffmpeg
Yupureki28 分钟前
《Linux系统编程》20.常见程序设计模式
linux·服务器·c语言·c++·单例模式·建造者模式·责任链模式
誰能久伴不乏39 分钟前
给开发板装上嘴巴与耳朵:i.MX6ULL 裸机串口 (UART) 驱动终极指南
arm开发·c++·单片机·嵌入式硬件·arm
biter down39 分钟前
深入浅出 C++ string 类:从原理到实战
开发语言·c++
Lhan.zzZ1 小时前
Qt多线程数据库操作:安全分离连接,彻底解决段错误
数据库·c++·qt·安全
小樱花的樱花1 小时前
C++引用:高效编程的技巧
开发语言·数据结构·c++·算法
Yupureki1 小时前
《算法竞赛从入门到国奖》算法基础:动态规划-最长子序列
c语言·c++·算法·动态规划