huanglinhuan dbb413b49d first commit
2025-10-14 20:06:34 +08:00
2025-10-14 20:06:34 +08:00
2025-10-14 20:06:34 +08:00
2025-10-14 20:06:34 +08:00
2025-10-14 20:06:34 +08:00
2025-10-14 20:06:34 +08:00

TLS多客户端服务器

这是一个支持多客户端连接的TLS服务器使用C语言实现支持TLS 1.2和1.3协议。

功能特性

  • 支持多客户端并发连接最多100个
  • 支持TLS 1.2和1.3协议
  • 动态端口指定
  • 接收客户端消息并计算MD5返回
  • 线程安全的客户端处理
  • 优雅的服务器关闭

系统要求

  • Linux/Unix系统
  • GCC编译器
  • OpenSSL开发库
  • pthread库

安装依赖

Ubuntu/Debian系统

make install-deps

CentOS/RHEL系统

make install-deps-centos

编译和运行

1. 编译项目

# 使用默认gcc编译器
make all

# 使用指定编译器
CC=clang make all      # 使用clang编译器
CC=gcc make all        # 使用gcc编译器默认
CC=cc make all         # 使用系统默认编译器

# 查看编译器信息
make info

2. 生成自签名证书

make cert

注意: 证书将生成在 cert/ 目录中:

  • cert/server.key - 服务器私钥
  • cert/server.crt - 服务器证书

3. 运行服务器

使用默认端口8443

make run

指定端口运行

make run-port
# 然后输入端口号例如9000

直接运行

./tls_server -p 9000    # 指定端口9000
./tls_server            # 使用默认端口8443
./tls_server -h         # 显示帮助信息

4. 测试客户端连接

make test

手动测试客户端

./tls_client -m "Hello World"                    # 基本测试
./tls_client -s 1500                             # 发送1500字节01数据
./tls_client -m "Hello" -c 5 -i 2               # 循环测试5次间隔2秒
./tls_client -s 2048 -c 3 -i 1                  # 发送2048字节01数据循环3次
./tls_client -m "Test" -h 192.168.1.100 -p 9000 # 连接到指定服务器
./tls_client -m "TLS1.2" -t 1.2                 # 强制使用TLS 1.2
./tls_client -s 512 -t 1.2 -c 2 -i 1            # 字节数+TLS版本测试
./tls_client -m "TLS1.3" -t 1.3                 # 强制使用TLS 1.3
./tls_client -m "Auto" -t auto                   # 自动协商TLS版本
./tls_client -m "Compare" -C -c 5               # TLS版本对比测试循环5轮
./tls_client -s 1024 -C -c 10                   # TLS版本对比测试1024字节10轮

使用说明

服务器端

  1. 启动服务器后它会监听指定端口的TLS连接
  2. 支持最多100个并发客户端连接
  3. 每个客户端连接都会在独立线程中处理
  4. 服务器会显示连接状态和TLS版本信息
  5. 按Ctrl+C可以优雅地关闭服务器
  6. 新增功能: 带时间戳的详细日志记录
  7. 新增功能: 按IP地址统计连接成功率和耗时

命令行参数

./tls_server -p 9000    # 在端口9000运行
./tls_server            # 使用默认端口8443
./tls_server -h         # 显示帮助信息

客户端

  1. 连接到TLS服务器
  2. 发送消息给服务器
  3. 接收服务器计算的MD5哈希值
  4. 自动断开连接
  5. 支持循环测试,可指定测试次数和间隔
  6. 提供详细的测试统计报告

客户端参数

./tls_client -m <消息> 或 -s <字节数> [-h 主机] [-p 端口] [-c 次数] [-i 间隔秒数] [-t TLS版本] [-C]

参数说明:

  • -m 消息: 要发送的消息内容
  • -s 字节数: 要发送的字节数发送01数据最大4095字节
  • -h 主机: 服务器主机地址(默认: localhost
  • -p 端口: 服务器端口(默认: 8443
  • -c 次数: 循环测试次数(默认: 1
  • -i 间隔: 测试间隔秒数(默认: 1
  • -t 版本: TLS版本: 1.2, 1.3, auto默认: auto
  • -C: TLS版本对比模式每轮先测试TLS 1.2等待2秒后测试TLS 1.3

测试统计报告

客户端测试完成后会输出详细的统计信息:

========================================
           测试统计报告
========================================
测试开始时间: Mon Jan 15 10:30:00 2024
测试结束时间: Mon Jan 15 10:30:15 2024
总耗时: 15.00 秒
----------------------------------------
总测试次数: 5
成功次数: 5
失败次数: 0
成功率: 100.00%
----------------------------------------
平均每次测试耗时: 3.00 秒
========================================
✅ 所有测试通过!

统计信息包括:

  • 测试开始和结束时间
  • 总耗时
  • 总测试次数
  • 成功和失败次数
  • 成功率
  • 平均每次测试耗时
  • 失败率(如果有失败)

项目结构

.
├── tls_server.c      # 服务器主程序
├── tls_client.c      # 客户端测试程序
├── generate_cert.sh  # 证书生成脚本
├── Makefile          # 编译配置
├── cert/             # 证书目录
│   ├── server.key    # 服务器私钥
│   └── server.crt    # 服务器证书
└── README.md         # 项目说明

技术实现

服务器端特性

  • 使用OpenSSL库实现TLS支持
  • 多线程处理客户端连接
  • 线程安全的客户端管理
  • 支持TLS 1.2和1.3协议
  • MD5哈希计算和返回

安全特性

  • TLS加密传输
  • 自签名证书(测试用)
  • 客户端证书验证(可配置)

示例输出

服务器端

[2024-01-15 10:30:00] 启动TLS服务器端口: 8443
[2024-01-15 10:30:00] 服务器已启动,等待客户端连接...
[2024-01-15 10:30:00] 支持TLS 1.2和1.3
[2024-01-15 10:30:00] 按Ctrl+C停止服务器
[2024-01-15 10:30:05] 新连接来自: 127.0.0.1:12345
[2024-01-15 10:30:05] 当前活跃连接数: 0/100
[2024-01-15 10:30:05] SSL握手成功IP: 127.0.0.1TLS版本: TLSv1.3
[2024-01-15 10:30:05] 客户端处理线程已创建,当前连接数: 1
[2024-01-15 10:30:05] 新客户端连接IP: 127.0.0.1线程ID: 140123456789套接字: 4
[2024-01-15 10:30:05] 收到客户端消息IP: 127.0.0.1,长度: 11内容: Hello World
[2024-01-15 10:30:05] MD5计算完成IP: 127.0.0.1,结果: b10a8db164e0754105b7a99be72e3fe5
[2024-01-15 10:30:05] 已发送MD5结果给客户端IP: 127.0.0.1
[2024-01-15 10:30:05] 开始清理客户端连接IP: 127.0.0.1,套接字: 4
[2024-01-15 10:30:05] 客户端连接已关闭IP: 127.0.0.1,当前连接数: 0

IP统计报告示例

[2024-01-15 10:35:00] IP统计 [127.0.0.1]: 总次数=10, 成功次数=10, 成功率=100.00%, 耗时=300秒
[2024-01-15 10:40:00] IP统计 [192.168.1.100]: 总次数=10, 成功次数=8, 成功率=80.00%, 耗时=600秒

客户端

[2024-01-15 10:30:00] 连接到TLS服务器: localhost:8443
[2024-01-15 10:30:00] 发送消息: Hello World
[2024-01-15 10:30:00] 测试次数: 1, 间隔: 1秒
[2024-01-15 10:30:00] TLS版本: 自动协商
[2024-01-15 10:30:00] 测试开始时间: Mon Jan 15 10:30:00 2024

[2024-01-15 10:30:00] === 测试 1/1 ===
[2024-01-15 10:30:00] TCP连接成功
[2024-01-15 10:30:00] SSL握手成功TLS版本: TLSv1.3
[2024-01-15 10:30:00] 消息已发送 (长度: 11)
[2024-01-15 10:30:00] 收到MD5结果: b10a8db164e0754105b7a99be72e3fe5
[2024-01-15 10:30:00] 连接已关闭

[2024-01-15 10:30:01] ========================================
[2024-01-15 10:30:01]            测试统计报告
[2024-01-15 10:30:01] ========================================
[2024-01-15 10:30:01] 测试开始时间: Mon Jan 15 10:30:00 2024
[2024-01-15 10:30:01] 测试结束时间: Mon Jan 15 10:30:01 2024
[2024-01-15 10:30:01] 总耗时: 1.00 秒
[2024-01-15 10:30:01] ----------------------------------------
[2024-01-15 10:30:01] 总测试次数: 1
[2024-01-15 10:30:01] 成功次数: 1
[2024-01-15 10:30:01] 失败次数: 0
[2024-01-15 10:30:01] 总重试次数: 0
[2024-01-15 10:30:01] 成功率: 100.00%
[2024-01-15 10:30:01] ----------------------------------------
[2024-01-15 10:30:01] 平均每次测试耗时: 1.00 秒
[2024-01-15 10:30:01] ========================================
[2024-01-15 10:30:01] ✅ 所有测试通过!

故障排除

编译错误

  • 确保已安装OpenSSL开发库
  • 检查GCC版本是否支持C99标准
  • struct timeval错误: 已添加#include <sys/time.h>头文件
  • pthread错误: 确保链接pthread库 (-lpthread)

编译器支持

  • 默认编译器: gcc
  • 支持编译器: gcc, clang, cc
  • 编译器参数: 使用CC=编译器名 make all指定编译器
  • 编译器信息: 使用make info查看当前编译器设置

连接错误

  • 确保端口未被占用
  • 检查防火墙设置
  • 验证证书文件是否存在

SSL错误处理

  • SSL读取错误: 1: 通常是客户端关闭连接导致,已改进错误处理
  • 消息截断警告: 当消息长度接近4KB时会显示警告
  • 客户端立即关闭: 客户端现在会等待服务器响应后再关闭连接
  • SSL系统调用错误: 改进了SSL_ERROR_SYSCALL错误处理防止服务器异常退出
  • 连接清理: 所有SSL错误都会正确清理连接资源

多客户端连接问题

  • 服务器卡住: 已添加线程分离和超时机制
  • 连接数统计: 服务器会显示当前活跃连接数
  • 资源清理: 改进了客户端连接清理逻辑
  • 线程管理: 使用pthread_detach自动回收线程资源

日志功能

  • 时间戳日志: 所有日志都带有精确的时间戳
  • IP统计: 按IP地址统计连接成功率和耗时
  • 统计报告: 每10次连接自动生成统计报告
  • 详细记录: 记录连接、SSL握手、消息处理等全过程

客户端日志功能

  • 时间戳日志: 客户端所有操作都带有时间戳
  • 测试统计: 显示测试次数、成功/失败次数、成功率
  • 性能监控: 记录每次测试的耗时和平均耗时
  • 详细记录: 记录连接建立、SSL握手、消息发送/接收等全过程
  • 重试机制: 连接失败时自动重试3次使用指数退避策略2秒、4秒、8秒
  • 重试统计: 统计总重试次数,重试成功不计入失败
  • 超时保护: 套接字读写操作30秒超时防止客户端卡住

性能优化

  • 调整MAX_CLIENTS常量以支持更多连接
  • 修改BUFFER_SIZE以适应更大的消息
  • 考虑使用连接池优化资源使用

许可证

本项目仅用于学习和测试目的。

Description
No description provided
Readme 47 KiB
Languages
C 90.6%
Makefile 9.4%