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

server/2025/2/24 23:10:04/

基于上一篇中 网络编程基础: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 1024void 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)

http://www.ppmy.cn/server/170418.html

相关文章

基于MFC实现的键盘电子乐器演奏程序

基于MFC实现的键盘电子乐器演奏程序设计 1.项目简介 需要连接西电微机原理实验室提供的 QTH9054 微机试验箱&#xff0c;使用其蜂鸣器发声&#xff0c;若不连接&#xff0c;程序会直接播放 mp3 文件模拟钢琴声。 请在 release 处下载编译好的 exe 文件运行&#xff0c;如需计…

【Unity】Unity clone 场景渲染的灯光贴图异位问题

Unity clone 场景渲染的灯光贴图异位问题 问题 需要将一个场景clone 一份保存到本地 当克隆完成后&#xff0c;副本场景的灯光贴图异位了&#xff0c;与原场景存在较大的差别 问题原因 场景被clone 后&#xff0c;场景的灯光渲染数据不能共用&#xff0c;即Lightmapping.li…

Https解决了Http的哪些问题

部分内容来源&#xff1a;小林coding 详细解析 Http的风险 HTTP 由于是明文传输&#xff0c;所以安全上存在以下三个风险&#xff1a; 1.窃听风险 比如通信链路上可以获取通信内容&#xff0c;用户号容易没。 2.篡改风险 比如强制植入垃圾广告&#xff0c;视觉污染&#…

DeepSeek掘金——SpringBoot 调用 DeepSeek API 快速实现应用开发

Spring Boot 实现 DeepSeek API 调用 1. 项目依赖 在 pom.xml 中添加以下依赖: <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>&l…

C#上位机--循环语句

序言 在 C# 编程中&#xff0c;循环语句是非常重要的控制结构&#xff0c;它允许我们重复执行一段代码&#xff0c;直到满足特定的条件。通过使用循环&#xff0c;我们可以高效地处理大量数据&#xff0c;简化代码逻辑。本文将详细介绍 C# 中四种常见的循环语句&#xff1a;Fo…

基于 DeepSeek LLM 本地知识库搭建开源方案(AnythingLLM、Cherry、Ragflow、Dify)认知

写在前面 博文内容涉及 基于 Deepseek LLM 的本地知识库搭建使用 ollama 部署 Deepseek-R1 LLM知识库能力通过 Ragflow、Dify 、AnythingLLM、Cherry 提供理解不足小伙伴帮忙指正 &#x1f603;,生活加油 我站在人潮中央&#xff0c;思考这日日重复的生活。我突然想&#xff0c…

Rust语言基础知识详解【一】

1.在windows上安装Rust Windows 上安装 Rust 需要有 C 环境&#xff0c;以下为安装的两种方式&#xff1a; 1. x86_64-pc-windows-msvc&#xff08;官方推荐&#xff09; 先安装 Microsoft C Build Tools&#xff0c;勾选安装 C 环境即可。安装时可自行修改缓存路径与安装路…

Unity游戏制作中的C#基础(6)方法和类的知识点深度剖析

1.驼峰命名法 在 C# 编程里&#xff0c;命名规范对于代码的可读性和可维护性至关重要&#xff0c;驼峰命名法便是其中广泛使用的一种命名约定&#xff0c;它主要分为小驼峰命名法和大驼峰命名法&#xff08;帕斯卡命名法&#xff09;。 小驼峰命名法&#xff1a;这种命名方式的…