C++ 回调函数 实现 的测试代码
最近项目里使用了异步Socket,使用的是完成端口做的e; Accept,receive,send 等完全的异步实现(多线程)
然后 又要多个端口使用, 后来想到包装下完成端口Socket,然后当有事件是触发回调函数,就不用手动搞N多个线程什么的
如是,测试例子如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | #include "stdafx.h" #include <string.h> #include <stdlib.h> #include <stdio.h> //回调函数 实现 的测试 #define __CallBackTestFun__ /*回调函数 **回调函数实现体必须是静态方法,并且应该使用"__stdcall"声明; 应该接受参数转换成本类指针,然后才能操作本类的成员 **即:static void __stdcall Fun(void* pthis,...) */ #ifdef __CallBackTestFun__ typedef void (__stdcall*POnData)( void *,unsigned int , void *) ; typedef void (__stdcall*POnReccive)( void *,unsigned int ) ; class TSocketObj { private : POnData pOnData,pp; POnReccive pOnReccive; void * tag; protected : void OnData(){pOnData(tag,123, "1234" );} public : int No; // unsigned char type; //0:TCP 1:UDP unsigned int sock; void * pdata; char name[21]; TSocketObj *next,*prior; TSocketObj(){ memset ( this ,0, sizeof (TSocketObj));} //初始化 也很重要 TSocketObj( void * Obj){ memset ( this ,0, sizeof (TSocketObj)); tag=Obj; printf ( "\nObj:%x\n" ,tag); } void SetCallBack( void * Obj,POnData onData,POnReccive onReccive){ tag=Obj;pOnData=onData;pOnReccive=onReccive; } void SetP(POnData p){pp=p;} void Go(){ if (pOnData)pOnData(tag,sock,name); if (pOnReccive)pOnReccive(tag,No); if (pp)pp(tag,sock,name); } }; class TSocket { TSocketObj socks; public : int m; TSocket(){} TSocket( int n){ Set(n); } static void __stdcall OnData( void * pThis,unsigned int no, void * d) { printf ( "\nThis is:%d Sock:%d\tname:%s" ,((TSocket*)pThis)->m,no,d); } friend void __stdcall OnReccive( void * pThis,unsigned int d) { printf ( "\n\tNo:%d\n" ,d); } //这个不能做回调函数 void __stdcall OnGo( void * pThis,unsigned int no, void * d) { printf ( "\n\tOnGo m:%d\n" ,m); } void Set( int d){ m=1000+d; socks.No=d; socks.sock=100*d+78; sprintf (socks.name, "Sock_%d" ,d); socks.SetCallBack( this , OnData, OnReccive); //POnData p=&(this->OnGo); //socks.SetP((void*)&this->OnGo); } void show(){socks.Go();} }; #endif int main( int argc, char * argv[]) { int iarr[10]={1,5,3,2,7,4,9,6,8,0}; //BrdNo //回调函数 实现 的测试 #ifdef __CallBackTestFun__ TSocket tr; tr.Set(7); tr.show(); TSocket ty; ty.Set(8); ty.show(); #endif scanf ( "%d" ,iarr); return 0; } |
这是个完整的例子,转载请注明:http://www.cnblogs.com/lzpong/
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
原文链接:https://www.cnblogs.com/lzpong/p/4228357.html
--- auth:lzpong
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!