【网络编程】基于 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫猫的小茶馆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值