当前位置: 首页 > article >正文

C语言回调函数在TCP客户端中的实现与应用

C语言回调函数在TCP客户端中的实现与应用1. 回调函数基础概念回调函数是一种通过函数指针实现的编程机制允许将一个函数作为参数传递给另一个函数。在C语言中回调函数的实现完全依赖于函数指针这与C、Python等现代语言中可能使用仿函数或匿名函数的实现方式有所不同。回调函数的核心价值在于实现代码的模块化和解耦增强程序的扩展性和灵活性简化接口设计降低模块间的耦合度2. TCP客户端架构设计2.1 系统整体架构本TCP客户端实现采用三层架构设计网络通信层处理基础的socket连接、数据收发业务逻辑层实现心跳检测、连接状态管理应用接口层通过回调机制向上层应用提供数据接收通知2.2 关键数据结构typedef void (* recv_callback)(char *data, int len); typedef struct param { recv_callback callback; } callback_param;该设计使用结构体封装回调函数指针便于线程间传递。recv_callback类型定义了标准的回调函数接口规范要求所有回调函数必须接收char*数据指针和int长度参数。3. 核心功能实现3.1 TCP连接管理连接状态机设计采用三种状态enum { STATE_NOCONNECTED, // 未连接 STATE_CONNECTED, // 已连接 STATE_DISCONNECTE // 连接断开 };连接建立过程的关键代码int tcp_connect(char *IP, int PORT) { if (connect_state STATE_NOCONNECTED) { struct sockaddr_in server_addr; sockfd socket(AF_INET, SOCK_STREAM, 0); if (sockfd 0) { syslog(LOG_ERR, create socket failed!\n); return -1; } memset(server_addr, 0, sizeof(server_addr)); server_addr.sin_family AF_INET; server_addr.sin_port htons(PORT); server_addr.sin_addr.s_addr inet_addr(IP); if (connect(sockfd, (struct sockaddr*)server_addr, sizeof(server_addr)) 0) { syslog(LOG_ERR, connet error!\n); return -1; } connect_state STATE_CONNECTED; syslog(LOG_INFO, connect success!\n); return 0; } else return -1; }3.2 数据接收线程实现独立的接收线程采用poll机制实现高效I/O多路复用void *thread_recv(void *param) { int ret; static char buf[2048] {0}; char heartbeat_buf[] heartbeat data; callback_param *p (callback_param *)param; struct pollfd c_poll; c_poll.fd sockfd; c_poll.events POLLIN; memset(buf, 0, sizeof(buf)); while (1) { if (connect_state STATE_CONNECTED) { ret poll(c_poll, 1, 5000); if (ret 0) { syslog(LOG_ERR, poll error!\n); break; } else if (0 ret) { if (send(sockfd, heartbeat_buf, sizeof(heartbeat_buf), 0) 0) { connect_state STATE_DISCONNECTE; syslog(LOG_ERR, disconnect!\n); break; } } else { if (recv(sockfd, buf, sizeof(buf), 0) 0) { syslog(LOG_INFO, recv:%s\n, buf); p-callback(buf, sizeof(buf)); } } } else break; } }该实现包含以下关键技术点5秒超时的心跳检测机制使用poll替代select提高性能接收数据后立即通过回调通知上层3.3 回调注册接口void tcp_register_callback(recv_callback cb) { pthread_t recv_t; static callback_param param; param.callback cb; pthread_create(recv_t, NULL, thread_recv, (void*)param); pthread_detach(recv_t); }此接口设计特点隐藏线程创建细节简化上层调用使用分离线程(pthread_detach)避免资源泄漏静态存储callback_param确保线程安全4. 应用示例4.1 基本使用模式void r_callback(char *msg, int len) { // 处理接收到的数据 } int main(int argc, char *argv[]) { char recv_buf[1024] {0}; char send_buf[1024] {0}; char str[16]; recv_callback func r_callback; if (argc 2){ printf(required parameter missing\n); return -1; } tcp_connect(argv[1],PORT); tcp_register_callback(func); while (1){ memset(send_buf, 0, sizeof(send_buf)); printf(please input something\n); scanf(%s,send_buf); tcp_send(send_buf); } tcp_disconnect(); return 0; }4.2 实际应用建议线程安全考虑回调函数中避免执行耗时操作需要共享数据时使用互斥锁保护错误处理增强添加连接重试机制实现更完善的心跳超时处理性能优化方向使用环形缓冲区减少数据拷贝实现零拷贝接收机制5. 设计模式分析本实现采用了典型的好莱坞原则Dont call us, well call you设计模式具有以下优势控制反转网络层控制何时调用应用层代码而非相反模块解耦网络通信与业务逻辑完全分离扩展性强只需实现新的回调函数即可支持不同业务逻辑6. 工程实践注意事项内存管理回调函数中不应释放接收缓冲区需要持久化数据时应进行深拷贝超时处理心跳超时应触发重连机制考虑添加最大重试次数限制日志记录关键状态变更应记录日志建议使用日志级别区分不同重要性信息// 良好的日志实践示例 syslog(LOG_ERR, connect error!); // 错误日志 syslog(LOG_INFO, connect success!); // 信息日志

相关文章:

C语言回调函数在TCP客户端中的实现与应用

C语言回调函数在TCP客户端中的实现与应用1. 回调函数基础概念回调函数是一种通过函数指针实现的编程机制,允许将一个函数作为参数传递给另一个函数。在C语言中,回调函数的实现完全依赖于函数指针,这与C、Python等现代语言中可能使用仿函数或匿…...

Gerrit SSH Key配置避坑指南:为什么Permission denied还在报错?

Gerrit SSH Key配置避坑指南:为什么Permission denied还在报错? 当你按照标准流程配置了SSH Key,却在克隆Gerrit仓库时遭遇Permission denied (publickey)错误,这种挫败感就像精心准备的钥匙打不开已知密码的锁。本文将带你深入排…...

STM32 RTC硬件自检工具CheckRTC:轻量级实时时钟可信度验证

1. 项目概述CheckRTC 是一个面向 STM32 系列微控制器的轻量级 RTC(实时时钟)模块自检与功能验证程序。其核心目标并非提供通用 RTC 驱动,而是作为嵌入式底层开发中关键的硬件可信度验证工具——在系统启动早期、固件升级后、或长期运行出现时…...

Arduino高性能WebSocket客户端库深度解析

1. Arduino-Websocket-Fast 库深度解析:面向嵌入式物联网的高性能 WebSocket 客户端实现1.1 设计动因与工程定位在嵌入式物联网(IoT)系统开发中,WebSocket 协议因其全双工、低开销、长连接特性,已成为设备与云平台间实…...

SDMatte边缘精修效果展示:发丝级分离、玻璃折射保留、薄纱纹理还原等高清案例图集

SDMatte边缘精修效果展示:发丝级分离、玻璃折射保留、薄纱纹理还原等高清案例图集 1. 惊艳效果预览 SDMatte作为专业级AI抠图工具,在处理复杂边缘和透明物体方面展现出惊人的能力。下面我们通过一组真实案例,展示它在不同场景下的表现。 1…...

OpenClaw技能市场盘点:10个适配Qwen3.5-4B-Claude的实用工具

OpenClaw技能市场盘点:10个适配Qwen3.5-4B-Claude的实用工具 1. 为什么需要关注技能适配性 当我第一次在OpenClaw上尝试安装第三方技能时,遇到了一个典型问题:技能安装成功了,但执行时模型总是输出"我不明白这个请求"…...

高效安全备份QQ空间历史说说:GetQzonehistory智能工具全指南

高效安全备份QQ空间历史说说:GetQzonehistory智能工具全指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字记忆日益珍贵的今天,QQ空间作为承载无数青春回…...

37 Python 时序和文本:词袋模型 BoW 和 TF-IDF 到底怎么理解?

Python 文本分析入门:词袋模型 BoW 和 TF-IDF 到底怎么理解? 上一篇主要解决了两个基础问题: 为什么中文文本通常要先分词?为什么分词之后还要做停用词过滤? 但文本清洗完成之后,新的问题很快就会出现&…...

别再手动写RTL了!用Vivado FIR Compiler IP核5分钟搞定一个低通滤波器

5分钟极速部署:用Vivado FIR Compiler IP核实现专业级低通滤波器 在FPGA信号处理领域,滤波器设计往往需要耗费工程师大量时间在RTL编码和验证上。但今天,我们将颠覆这一传统工作流程——通过Vivado的FIR Compiler IP核,即使没有深…...

Markdown Viewer浏览器扩展完全指南:从安装到高级配置

Markdown Viewer浏览器扩展完全指南:从安装到高级配置 【免费下载链接】markdown-viewer Markdown Viewer / Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-viewer Markdown Viewer是一款功能丰富的浏览器扩展,专为提…...

36 Python 时序和文本:中文文本处理入门:为什么要先做分词和停用词过滤?

中文文本处理入门:为什么要先做分词和停用词过滤? 刚接触文本分析时,很多人都会有一个疑问: 文本明明已经有内容了,为什么不能直接拿去做分类、聚类或者情感分析? 这个问题其实正好指向了文本挖掘里最基础、…...

云效流水线实战:从零部署Java应用到阿里云ECS(含完整脚本)

云效流水线实战:从零部署Java应用到阿里云ECS(含完整脚本) 在当今快节奏的软件开发环境中,自动化部署已成为提升团队效率的关键环节。阿里云云效平台提供的流水线功能,为开发者提供了一套完整的CI/CD解决方案&#xff…...

跨境云手机适用于哪些场景

跨境云手机适用于多种场景,能为不同用户群体带来便利与价值,对于跨境电商从业者而言,可用于多账号管理与运营,通过在云端虚拟出不同地区、不同配置的手机环境,实现多个店铺账号的同时登录和独立操作,有效规…...

果园灌溉施肥控制系统改造之西门子 S7 - 1200 PLC 实战

果园灌溉施肥控制系统改3 西门子s7-1200plc程序博途v16,带 选型表 io表接线图CAD和运行效果视频最近搞了个果园灌溉施肥控制系统的改造项目,用的是西门子 S7 - 1200 PLC,编程软件是博途 V16,这过程还挺有意思,跟大家…...

知识引导上下文优化(KgCoOp):一种解决灾难性遗忘的 Prompt Tuning 机制

来源:DeepHub IMBA 本文约3000字,建议阅读5分钟本文提出了一种简单有效的约束机制。视觉-语言模型(VLMs)如 CLIP 彻底改变了零样本图像识别的处理方式。这类模型在包含 4 亿个图像-文本对的大规模数据集上进行训练,捕获…...

C++/Qt 使用 Tushare 获取股票信息

探索数据之源:使用tushare为Qt/C学习项目获取股票数据在进行金融量化分析或学习金融市场行为时,获取高质量、结构化的股票数据是至关重要的第一步。作为一个计划将Qt/C用于金融数据可视化或策略模拟的学习者,我近期深入体验了使用Python库tus…...

VR视频转换终极指南:让3D内容在普通设备上轻松播放

VR视频转换终极指南:让3D内容在普通设备上轻松播放 【免费下载链接】VR-reversal VR-Reversal - Player for conversion of 3D video to 2D with optional saving of head tracking data and rendering out of 2D copies. 项目地址: https://gitcode.com/gh_mirro…...

如何用ChatALL实现AI智能协同:一次提问,多模型对比的解决方案

如何用ChatALL实现AI智能协同:一次提问,多模型对比的解决方案 【免费下载链接】ChatALL Concurrently chat with ChatGPT, Bing Chat, Bard, Alpaca, Vicuna, Claude, ChatGLM, MOSS, 讯飞星火, 文心一言 and more, discover the best answers 项目地…...

好用还专业!高效论文写作全流程AI论文网站推荐(2026 最新)

论文写作全流程可拆解为文献调研→选题/开题→大纲/初稿→文献综述→降重/去AI味→润色/格式→查重/投稿七大环节,以下工具按环节精准匹配,兼顾中文适配、降重能力、去AI痕迹、学术合规四大核心需求,覆盖免费/付费、通用/垂直场景。2026年AI论…...

缺失的第一个正数(力扣100)

最朴素的想法就是从1开始查找,看看谁不在,时间复杂度为On但是需要把原数组变成集合,空间复杂度为On不符合题目的常数级空间开销我们要找的是“第一个缺失的正数”。如果数组长度是 $N$,那么这个答案一定落在 [1, N1] 这个区间里。…...

终极简单教程:如何使用bilibili-parse免费获取B站视频资源

终极简单教程:如何使用bilibili-parse免费获取B站视频资源 【免费下载链接】bilibili-parse bilibili Video API 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse 想要快速获取B站视频资源却不知道从何入手?bilibili-parse作为一款简…...

3D元器件库技术解析与工程应用指南

## 1. 3D元器件库技术解析与应用指南### 1.1 3D封装库的技术价值 在现代电子设计自动化(EDA)流程中,高质量的3D元器件库可显著提升设计效率。本套封装库包含1088个标准封装模型,涵盖电阻器、电容器、接线端子、IC芯片、晶振等常见电子元件,所…...

SAP FICO财务账期管理实战:关键配置与月结操作指南

1. SAP FICO财务账期管理基础概念 财务账期管理是SAP FICO模块中最基础也最重要的功能之一。简单来说,它就像财务部门的"门禁系统",控制着哪些会计凭证能在特定时间段被录入系统。想象一下,如果超市收银台没有营业时间限制&#xf…...

手把手教你用NOAA气象数据做可视化分析(含常见字段解析与避坑指南)

手把手教你用NOAA气象数据做可视化分析(含常见字段解析与避坑指南) 气象数据可视化是理解气候模式、分析极端天气事件的重要工具。美国国家海洋和大气管理局(NOAA)提供的全球历史气候网络日数据(GHCN-Daily&#xff0…...

5个必知技巧:让你的PT下载效率提升300%的浏览器插件指南

5个必知技巧:让你的PT下载效率提升300%的浏览器插件指南 【免费下载链接】PT-Plugin-Plus PT 助手 Plus,为 Microsoft Edge、Google Chrome、Firefox 浏览器插件(Web Extensions),主要用于辅助下载 PT 站的种子。 项…...

深度剖析:synchronized 底层实现原理(JVM 视角)

一、Java对象内存布局的深度拆解原文提到了对象头,这里补充64位JVM的完整对象布局和对齐填充的底层原因。1.1 64位JVM的完整对象结构text┌─────────────────────────────────────────────┐ │ 对象头…...

类型注解写错=线上Bug潜伏!:3个导致Pydantic崩溃、FastAPI 500、mypy静默失效的致命细节

第一章:类型注解写错线上Bug潜伏!:3个导致Pydantic崩溃、FastAPI 500、mypy静默失效的致命细节泛型未参数化:List 而非 List[str] 的隐式陷阱 Pydantic v2 强制要求泛型类型必须显式参数化。若仅写 List(而非 List[str…...

利用快马平台快速构建免费节点测试工具原型,十分钟完成开发

今天想和大家分享一个快速验证免费节点可用性的小工具开发过程。作为一个经常需要测试代理节点的开发者,手动一个个验证实在太费时间,于是我用InsCode(快马)平台快速搭建了一个原型工具,整个过程比想象中简单很多。 需求分析 免费节点测试工具…...

Windows Defender移除工具终极指南:如何彻底禁用Windows Defender提升系统性能

Windows Defender移除工具终极指南:如何彻底禁用Windows Defender提升系统性能 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://git…...

ComfyUI与Stable Diffusion WebUI模型共享终极指南:如何通过extra_model_paths.yaml一键配置

ComfyUI与Stable Diffusion WebUI模型共享终极指南:如何通过extra_model_paths.yaml一键配置 在AI绘图领域,ComfyUI和Stable Diffusion WebUI(简称WebUI)各有优势。ComfyUI以其高度可定制的工作流著称,而WebUI则提供了…...