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轮
使用说明
服务器端
- 启动服务器后,它会监听指定端口的TLS连接
- 支持最多100个并发客户端连接
- 每个客户端连接都会在独立线程中处理
- 服务器会显示连接状态和TLS版本信息
- 按Ctrl+C可以优雅地关闭服务器
- 新增功能: 带时间戳的详细日志记录
- 新增功能: 按IP地址统计连接成功率和耗时
命令行参数
./tls_server -p 9000 # 在端口9000运行
./tls_server # 使用默认端口8443
./tls_server -h # 显示帮助信息
客户端
- 连接到TLS服务器
- 发送消息给服务器
- 接收服务器计算的MD5哈希值
- 自动断开连接
- 支持循环测试,可指定测试次数和间隔
- 提供详细的测试统计报告
客户端参数
./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.1,TLS版本: 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
Languages
C
90.6%
Makefile
9.4%