最近项目里使用了异步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/

05-11 19:46