基于C语言的TCP通信测试程序开发指南
一、TCP通信基础原理
1.1 通信流程概述
TCP通信采用客户端-服务器模型,核心流程如下:
服务器端:
-
创建套接字(Socket)
-
绑定地址和端口(Bind)
-
开始监听(Listen)
-
接受连接(Accept)
-
数据交互(Send/Recv)
-
关闭连接(Close)
客户端:
-
创建套接字(Socket)
-
连接服务器(Connect)
-
数据交互(Send/Recv)
-
关闭连接(Close)
1.2 网络字节序
使用htonl()
、htons()
等函数处理端口和地址转换,保证不同架构设备间的兼容性。
二、服务器端实现
2.1 完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h>#define PORT 8080 #define BUFFER_SIZE 1024int main() {int server_fd, client_fd;struct sockaddr_in address;int opt = 1;socklen_t addrlen = sizeof(address);char buffer[BUFFER_SIZE];// 创建TCP套接字if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}// 设置套接字选项if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {perror("setsockopt");exit(EXIT_FAILURE);}address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);// 绑定地址if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// 开始监听if (listen(server_fd, 3) < 0) {perror("listen");exit(EXIT_FAILURE);}printf("Server listening on port %d...\n", PORT);// 接受连接if ((client_fd = accept(server_fd, (struct sockaddr*)&address, &addrlen)) < 0) {perror("accept");exit(EXIT_FAILURE);}// 接收数据ssize_t bytes_read = recv(client_fd, buffer, BUFFER_SIZE, 0);if (bytes_read > 0) {buffer[bytes_read] = '\0';printf("Received: %s\n", buffer);// 发送响应const char* response = "Message received";send(client_fd, response, strlen(response), 0);}close(client_fd);close(server_fd);return 0; }
2.2 关键代码解析
-
套接字创建:
socket(AF_INET, SOCK_STREAM, 0)
-
AF_INET
:IPv4协议 -
SOCK_STREAM
:TCP协议类型
-
-
地址重用选项:
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))
避免"Address already in use"错误
-
绑定地址:
bind(server_fd, (struct sockaddr*)&address, sizeof(address))
-
INADDR_ANY
表示绑定所有网络接口
-
三、客户端实现
3.1 完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h>#define SERVER_IP "127.0.0.1" #define PORT 8080 #define BUFFER_SIZE 1024int main() {int sock;struct sockaddr_in serv_addr;char buffer[BUFFER_SIZE];// 创建套接字if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(PORT);// 转换IP地址if (inet_pton(AF_INET, SERVER_IP, &serv_addr.sin_addr) <= 0) {perror("invalid address");exit(EXIT_FAILURE);}// 连接服务器if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {perror("connection failed");exit(EXIT_FAILURE);}// 发送数据const char* message = "Hello Server!";send(sock, message, strlen(message), 0);printf("Sent: %s\n", message);// 接收响应ssize_t bytes_received = recv(sock, buffer, BUFFER_SIZE, 0);if (bytes_received > 0) {buffer[bytes_received] = '\0';printf("Response: %s\n", buffer);}close(sock);return 0; }
3.2 关键代码解析
-
地址转换:
inet_pton(AF_INET, SERVER_IP, &serv_addr.sin_addr)
将点分十进制IP转换为二进制格式
-
连接超时处理:
实际项目中建议添加超时设置:struct timeval timeout = {5, 0}; // 5秒超时 setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));
四、编译与测试
4.1 编译方法
# 编译服务器 gcc server.c -o server# 编译客户端 gcc client.c -o client
4.2 运行测试
# 服务器端 ./server# 客户端(另启终端) ./client
4.3 预期输出
服务器端:
Server listening on port 8080... Received: Hello Server!
客户端:
Sent: Hello Server! Response: Message received
五、进阶开发指南
5.1 多客户端支持
使用多线程处理并发连接:
#include <pthread.h>void* client_handler(void* arg) {int client_fd = *(int*)arg;// 处理客户端请求close(client_fd);pthread_exit(NULL); }// 在accept循环中 while(1) {int client_fd = accept(...);pthread_t thread;pthread_create(&thread, NULL, client_handler, &client_fd);pthread_detach(thread); }
5.2 数据完整性保障
-
添加包头校验:
struct packet_header {uint32_t magic; // 固定标识 0xDEADBEEFuint32_t length; // 数据长度uint16_t checksum; // CRC校验 };
-
使用循环接收确保完整数据:
size_t total_received = 0; while(total_received < expected_len) {ssize_t n = recv(fd, buffer+total_received, expected_len-total_received, 0);if(n <= 0) break;total_received += n; }
5.3 性能优化技巧
-
禁用Nagle算法:
int flag = 1; setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(int));
-
调整缓冲区大小:
int buf_size = 1024 * 1024; // 1MB setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &buf_size, sizeof(int));
六、常见问题排查
问题现象 | 可能原因 | 解决方案 |
---|---|---|
Connection refused | 服务器未启动/端口未开放 | 检查服务状态和防火墙设置 |
Address already in use | 端口被占用 | 设置SO_REUSEADDR选项 |
数据不完整 | 未处理部分发送/接收 | 使用循环发送接收逻辑 |
连接超时 | 网络不通/服务器无响应 | 使用telnet测试端口连通性 |
数据乱码 | 未正确处理字符串终止符 | 确保接收缓冲区添加'\0' |
七、扩展应用场景
-
文件传输工具:实现文件分块传输和校验
-
即时通讯系统:支持多用户文本消息传递
-
远程监控系统:实时传输传感器数据
-
分布式计算节点:任务分配与结果收集
通过本指南,开发者可以快速搭建基础的TCP通信测试环境,并根据实际需求进行功能扩展。建议结合Wireshark等网络分析工具进行协议级调试,以深入理解TCP通信机制。
相关文章:

基于C语言的TCP通信测试程序开发指南
一、TCP通信基础原理 1.1 通信流程概述 TCP通信采用客户端-服务器模型,核心流程如下: 服务器端: 创建套接字(Socket) 绑定地址和端口(Bind) 开始监听(Listen) 接受…...
Git 分支指南
什么是 Git 分支? Git 分支是仓库内的独立开发线,你可以把它想象成一个单独的工作空间,在这里你可以进行修改,而不会影响主分支(或 默认分支)。分支允许开发者在不影响项目实际版本的情况下,开…...

教育系统源码如何支持白板直播与刷题功能?功能开发与优化探索
很多行业内同学疑问,如何在教育系统源码中支持白板直播和刷题功能?本篇文章,小编将从功能设计、技术实现到性能优化,带你全面了解这个过程。 一、白板直播功能的核心需求与技术挑战 实时交互与同步性 白板直播的核心是“实时性”。…...
SSM框架整合MyBatis-Plus的步骤和简单用法示例
以下是 SSM框架整合MyBatis-Plus的步骤 和 简单用法示例: 一、SSM整合MyBatis-Plus步骤 1. 添加依赖(Maven) <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.…...
【LeetCode 热题 100】206. 反转链表
📌 难度:简单 📚 标签:链表、双指针、迭代、递归 🔗 题目链接(LeetCode CN) 🧩 一、题目描述 给你单链表的头节点 head,请你反转链表,并返回反转后的链表。 ✅…...
centos8.5.2111 更换阿里云源
使用前提是服务器可以连接互联网 1、备份现有软件配置文件 cd /etc/yum.repos.d/ mkdir backup mv CentOS-* backup/ 2、下载阿里云的软件配置文件 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo 3、清理并重建…...

再度深入理解PLC的输入输出接线
本文再次重新梳理: 两线式/三线式传感器的原理及接线、PLC的输入和输出接线,深入其内部原理,按照自己熟悉的方式去理解该知识 在此之前,需要先统一几个基础知识点: 在看任何电路的时候,需要有高低电压差&…...

k8s(11) — 探针和钩子
钩子和探针的区别: 在 Kubernetes(k8s)中,钩子(Hooks)和探针(Probes)是保障应用稳定运行的重要机制,不过它们的用途和工作方式存在差异,以下为你详细介绍&…...

使用jmeter对数据库进行压力测试
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 前言 很多人提到 jmeter时,只会说到jmeter进行接口自动化或接口性能测试,其实jmeter还能对数据库进行自动化操作。个人常用的场景有以下&…...
Scala与Go的异同教程
当瑞士军刀遇到电锯:Scala vs Go的相爱相杀之旅 各位准备秃头的程序猿们(放心,用Go和Scala不会加重你的发际线问题),今天我们来聊聊编程界的"冰与火之歌"——Scala和Go的异同。准备好瓜子饮料,我…...
LeetCode 热题 100 138. 随机链表的复制
LeetCode 热题 100 | 138. 随机链表的复制 大家好,今天我们来解决一道经典的链表问题——随机链表的复制。这道题在 LeetCode 上被标记为中等难度,要求深拷贝一个带有随机指针的链表。 问题描述 给你一个长度为 n 的链表,每个节点包含一个额…...

Kubernetes生产实战(十四):Secret高级使用模式与安全实践指南
一、Secret核心类型解析 类型使用场景自动管理机制典型字段Opaque (默认)自定义敏感数据需手动创建data字段存储键值对kubernetes.io/dockerconfigjson私有镜像仓库认证kubelet自动更新.dockerconfigjsonkubernetes.io/tlsTLS证书管理Cert-Manager可自动化tls.crt/tls.keykube…...

05 mysql之DDL
一、SQL的四个分类 我们通常可以将 SQL 分为四类,分别是: DDL(数据定义语言)、DML(数据操作语言)、 DCL(数据控制语言)和 TCL(事务控制语言)。 DDL 用于创建…...

电池热管理CFD解决方案,为新能源汽车筑安全防线
在全球能源结构加速转型的大背景下,新能源汽车产业异军突起,成为可持续发展的重要驱动力。而作为新能源汽车 “心脏” 的电池系统,其热管理技术的优劣,直接决定了车辆的安全性、续航里程和使用寿命。电池在充放电过程中会产生大量…...
使用互斥锁保护临界
Linux线程互斥及相关概念解析 1. 临界资源(Critical Resource) 定义:被多个线程共享的资源(如变量、文件、内存区域等),需通过互斥访问确保数据一致性。特点: 共享性:多个线程可能…...
Android第三次面试总结之网络篇补充
一、网络模型:OSI 七层 vs TCP/IP 四层(必考点) 1. 分层模型对比 OSI 七层模型TCP/IP 四层模型核心功能Android 相关场景应用层(7 层)应用层定义数据格式(HTTP/HTTPS/FTP/API)OkHttp/Retrofit…...
网络世界的“快递站”:深入浅出OSI七层模型
网络世界的“快递站”:OSI七层模型的奇妙旅程 为什么需要OSI七层模型? 想象一下,你正在给朋友寄一份生日礼物。你需要先包装礼物、贴上地址标签、选择快递公司、支付运费,最后把包裹交给快递员。这个过程看似简单,但…...
使用 Apache POI 生成包含文本和图片的 Word 文档
一、概述 在实际开发场景中,我们经常需要自动生成包含文本和图片的 Word 文档。本示例借助 Apache POI 库,实现了向 Word 文档中插入文本和图片的功能。代码会循环插入多次文本和同一张图片,并且对图片进行等比缩放处理,以保证图片…...

TransmittableThreadLocal:穿透线程边界的上下文传递艺术
文章目录 前言一、如何线程上下文传递1.1 ThreadLocal单线程1.2 InheritableThreadLocal的继承困境1.3 TTL的时空折叠术 二、TTL核心设计解析2.1 时空快照机制2.2 装饰器模式2.3 采用自动清理机制 三、设计思想启示四、实践启示录结语 前言 在并发编程领域,线程上下…...

基于STM32的甲醛检测
一、制作目标 以正点原子的miniSTM32F103RCT6开发板为主控,使用甲醛传感器检测环境空气中的甲醛含量(以mg/m^3为单位)、C02含量(以ppm为单位)和总有机挥发物含量TVOC(以mg/m^3为单位)在OLED显示…...

洛图报告中的 FSHD 是什么?—— 解密九天画芯推动的三色光源显示技术
目录 一、洛图报告新焦点:FSHD 为何成为显示产业重要突破方向? (一)洛图报告核心结论:从技术突围到产业重构 二、技术解析:FSHD 如何重构显示底层逻辑? (一)物理架构…...
含锡电镀废水深度净化技术体系解析化利用的全流程优化
一、含锡电镀废水的产生机理与污染特征 含锡电镀废水主要形成于三个关键生产环节:镀槽液定期置换排放、镀件后处理清洗水以及车间地面冲洗水。其中,清洗水作为电镀工艺的附属产物,承担着清除镀层表面残留镀液的重要功能;冲刷废水则…...

【MySQL】事务(重点)
目录 一、什么是事务: 二、事务的前置知识了解 引擎是否支持事务 事务的提交方式 事务操作的前置准备: 三、事务回滚: 四、事务崩溃: 原子性: 持久性: 五、自动提交和手动提交: 六、…...

Linux:线程同步与互斥
目录 线程互斥 锁 初始化 销毁 加锁 解锁 线程同步 条件变量 初始化 销毁 等待条件满足 唤醒等待 pthread_cond_signal pthread_cond_broadcast 生产者消费者模型 3种关系 2种角色 1个交易场所 POSIX信号量 初始化 销毁 等待 发布 线程互斥 互斥相关…...

每天五分钟机器学习:拉格朗日对偶函数
本文重点 在数学优化领域,拉格朗日对偶函数作为连接原始约束问题与对偶问题的核心纽带,展现了将复杂约束优化转化为无约束优化的方式。 数学表达 原始问题建模 拉格朗日函数构造 此时的目标就是: 先假设w为常数,让拉格朗日函数对橙子变量λ求极大值,消掉λ之后,在对λ求…...

AutoGen 框架解析:微软开源的多人 Agent 协作新范式
一、引言 在大语言模型(LLM)快速发展的今天,复杂任务的自动化协作需求日益增长。微软开源的AutoGen 框架(GitHub Star 超 10 万)提供了一种基于多智能体对话的协作范式,通过自然语言交互实现多角色 Agent …...

【bibtex4word】在Word中高效转换bib参考文献,Texlive环境安装bibtex4word插件
前言 现已退出科研界,本人水货一个。希望帮到有缘人 本篇关于如何将latex环境中的参考文献bib文件转化为word,和一些踩坑记录。 可以看下面的资料进行配置,后面的文字是这些资料的补充说明。 参考文章:https://blog.csdn.net/g…...
Listremove数据时报错:Caused by: java.lang.UnsupportedOperationException
看了二哥的foreach陷阱后,自己也遇见了需要循环删除元素的情况,立马想到了当时自己阴差阳错的避开所有坑的解决方式:先倒序遍历,再删除。之前好使,但是这次不好使了,报错Caused by: java.lang.UnsupportedO…...
k8s node 报IPVS no destination available
在 Kubernetes 集群中,IPVS no destination available 错误通常表示 kube-proxy(IPVS 模式)无法为 Service 找到可用的后端 Pod。这会导致流量无法正确转发,影响服务可用性。以下是详细的排查和解决方法: 一、错误原因…...

单片机-STM32部分:10-2、逻辑分析仪
飞书文档https://x509p6c8to.feishu.cn/wiki/VrdkwVzOnifH8xktu3Bcuc4Enie 安装包如下:根据自己的系统选择,目前这个工具只有window版本哦 安装方法比较简单,都按默认下一步即可,注意不要安装到中文路径哦。 其余部分参考飞书文档…...