当前位置: 首页 > news >正文

【网络编程】基于 TCP协议 的服务器-客户端通信模型的加密传输、多线程并发服务器

基于上一篇中 网络编程基础:TCP/UDP 协议 实现了基于 TCP 协议的网络通信模型。基于此之上,我们继续介绍 加密传输用多线程实现客户端程序与网络调试助手进行双向通信(多线程并发服务器)。

这是一个基于 OpenSSL 的 TLS(SSL)加密传输的 TCP 服务器-客户端 通信示例。这种方式可以确保数据在传输过程中被加密,防止中间人攻击和数据窃取。

代码说明

使用 OpenSSL:提供TLS/SSL加密通信。
服务器(server.c)

  1. 生成 TLS 证书并加载;
  2. 监听客户端连接;
  3. 通过 TLS 进行加密通信。

客户端(client.c):连接服务器并使用 TLS 进行加密通信。

生成 SSL 证书(自签名)

在运行代码之前,我们需要生成自签名证书:

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes

执行后会要求输入一些信息(可以随意填写),这样会生成

  • cert.pem(SSL 证书)
  • key.pem(私钥)
服务器代码(server.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

#define PORT 8080
#define BUFFER_SIZE 1024

void init_openssl() {
   
    SSL_library_init();
    OpenSSL_add_all_algorithms();
    SSL_load_error_strings();
}

SSL_CTX *create_context() {
   
    const SSL_METHOD *method = SSLv23_server_method();
    SSL_CTX *ctx = SSL_CTX_new(method);
    if (!ctx) {
   
        perror("Unable to create SSL context");
        ERR_print_errors_fp(stderr);
        exit(EXIT_FAILURE);
    }
    return ctx;
}

void configure_context(SSL_CTX *ctx) {
   
    if (SSL_CTX_use_certificate_file(ctx, "cert.pem", SSL_FILETYPE_PEM) <= 0 ||
        SSL_CTX_use_PrivateKey_file(ctx, "key.pem", SSL_FILETYPE_PEM) <= 0) {
   
        ERR_print_errors_fp(stderr);
        exit(EXIT_FAILURE);
    }
}

int main() {
   
    int server_fd, client_fd;
    struct sockaddr_in address;
    socklen_t addr_len = sizeof(address);
    char buffer[BUFFER_SIZE] = {
   0};

    init_openssl();
    SSL_CTX *ctx = create_context();
    configure_context(ctx);

    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd < 0) {
   
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT)

相关文章:

  • Qt--源码
  • Xen Center虚拟机Centos 7.x磁盘扩容
  • Java 中的 CopyOnWriteArrayList 是什么?
  • 工作-绩效笔记
  • Java+SpringBoot+Vue+数据可视化的综合健身管理平台(程序+论文+讲解+安装+调试+售后)
  • Vue 3 30天精进之旅:Day 30 - Vue生态系统的未来探索
  • C++数据切片问题,Plus多态
  • C++ STL中的reverse/unique/sort/lower_bound/upper_bound函数使用
  • Spring DI
  • React组件化开发详解
  • 责任链模式原理详解和源码实例以及Spring AOP拦截器链的执行源码如何使用责任链模式?
  • 【Javascript Day20】
  • MariaDB10创建用户并授权
  • Git LFS介绍(Large File Storage)大文件扩展,将大文件存储在外部存储,仓库中只记录文件的元数据(大文件的指针,类似一个小的占位符文件)
  • 深入了解XML:初学者的全面指南
  • 计算机网络:应用层 —— 动态主机配置协议 DHCP
  • 基于腾讯云大模型知识引擎×DeepSeek构建八字、六爻赛博算卦娱乐应用
  • 进程控制(靠原语实现)
  • 关于房间传感器监测数据集的探索
  • 3-知识图谱-知识图谱的存储与查询
  • “麒麟王”亮相上海彩市,体彩即开票“瑞兽家族”迎来新成员
  • 开门红背后的韧性密码:上海八大企业的“反脆弱”与“真功夫”
  • 人民日报评论员:汇聚起工人阶级和广大劳动群众的磅礴力量
  • AI观察|算力饥渴与泡沫
  • 物业也能成为居家养老“服务员”,上海多区将开展“物业+养老”试点
  • 全国电影工作会:聚焦扩大电影国际交流合作,提升全球影响力