码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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 客户端代码实现
    • 更多关于C API封装为C++类,参考

    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();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2. 客户端C API的封装分析

    2.1 sckClient_init()和sckClient_destroy()

    int sckClient_init(); 可以使用构造函数代替

    TcpSocket();
    TcpSocket(int fd);
    ~TcpSocket();
    
    • 1
    • 2
    • 3

    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;
    
    • 1
    • 2
    • 3

    2.3 sckClient_closeconn()

    /* 客户端 关闭和服务端的连接 */
    int sckClient_closeconn(int connfd );

    int disConnect();
    
    • 1

    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)
    
    • 1

    2.5 sckClient_rev()

    /* 客户端 接受报文 */
    int sckClient_rev(int connfd, int revtime, unsigned char **out, int *outlen);

    string recvMsg(int timeout)
    
    • 1

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    5. 服务端C++

    // 这个类不能用, 因为只能和一个客户端建立连接
    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;    // 通信的文件描述符
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    6. 客户端和服务端代码框架

    在这里插入图片描述

    7.代码实现

    7.1 服务端代码实现

    在这里插入图片描述

    7.2 客户端代码实现

    在这里插入图片描述

    更多关于C API封装为C++类,参考

    • 可以直接进行阅读,没有线程池以外的新知识

    Openssl数据安全传输平台013:手写C/C++线程池 --C API封装为C++类

  • 相关阅读:
    typeof null的结果为什么是Object?
    androd 如何使得升级更加容易 以及规范app文件使用
    计算机网络再次整理————tcp周边[八]
    营收下滑,腾讯游戏还能保持「王者」地位吗?
    Python测试题15道(含答案)
    QT5.14.2 视频分帧:QT与FFmpeg的高效结合
    基于哈夫曼树的数据压缩算法
    Linux shell编程学习笔记27:tputs
    打工人一定要学会找资源~
    grafana可视化
  • 原文地址:https://blog.csdn.net/jiangchufeng123/article/details/133971423
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号