最近项目里使用了异步Socket,使用的是完成端口做的e; Accept,receive,send 等完全的异步实现(多线程)
然后 又要多个端口使用, 后来想到包装下完成端口Socket,然后当有事件是触发回调函数,就不用手动搞N多个线程什么的
如是,测试例子如下:
#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/
时间: 2024-11-05 22:44:12