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

C++ 回调函数 实现 的测试代码的更多相关文章

  1. ajax的回调函数和匿名函数

    1.什么是js回调函数 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为函数实际上 ...

  2. 异步编程(回调函数,promise)

    一.回调函数 ①概念:一般情况下,程序会时常通过API调用库里所预先备好的函数.但是有些库函数却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务.这个被传入的.后又被调用的函数就称为回调函 ...

  3. js中的回调函数的理解和使用方法

    js中的回调函数的理解和使用方法 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为 ...

  4. Javascript之回调函数(callback)

    1.回调函数定义: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方 ...

  5. 关于js的callback回调函数的理解

    回调函数的处理逻辑理解:所谓的回调函数处理逻辑,其实就是先将回调函数的代码 冻结(或者理解为闲置),接着将这个回调函数的代码放到回调函数管理器的队列里面. 待回调函数被触发调用的时候,对应的回调函数的 ...

  6. 理解javascript 回调函数

    ##回调函数定义 百度百科:回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不 ...

  7. ArcGIS API for JavaScript 4.2学习笔记[7] 鹰眼(缩略图的实现及异步处理、Promise、回调函数、监听的笔记)

    文前说明:关于style就是页面的css暂时不做评论,因为官方给的例子的样式实在太简单了,照抄阅读即可. 这篇文章有着大量AJS 4.x版本添加的内容,如监听watch.Promise对象.回调函数. ...

  8. jQuery的deferred对象详解 jquery回调函数

    http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html jQuery的 ...

  9. 告诉你什么是javascript的回调函数

    函数也是对象 想弄明白回调函数,首先的清楚地明白函数的规则.在javascript中,函数是比较奇怪的,但它确确实实是对象.确切地说,函数是用Function()构造函数创建的Function对象.F ...

随机推荐

  1. VS下运行项目时,检测到在集成的托管管道模式下不适用的 ASP.NET 设置。

    vs2012调试时默认会是集成模式,vs2012调试时怎么使用传统模式哪? 这个时候只要选中启动项目按F4,在托管管道模式里选传统模式即可!

  2. 我理想中的父母(The Ideal Parents In My Heart)

    Parents are the first teachers in children's life, and people all know the great importance exactly ...

  3. 创建WP8试用应用

    参考资料: 创建 Windows Phone 的试用应用 如何在 Windows Phone 应用中实现试用体验 Windows Phone 7 开发 31 日谈——第23日:提供试用版应用程序 对资 ...

  4. Python 端口,IP扫描

    Python Socket函数 (1)TCP发送数据时,已建立好连接,不需要指定地址.UDP是面向无连接,每次分别指定发给谁. (2)s.bind(address) 将套接字绑定到地址,在AF_INE ...

  5. Django--全文检索功能

    经过两个月的时间,毕设终于算是把所有主要功能都完成了,最近这一周为了实现全文检索的功能,也算是查阅了不少资料,今天就在这里记录一下,以免以后再用到时抓瞎了~ 首先介绍一下我使用的Django全文检索逻 ...

  6. HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number                         ...

  7. java分享第十八天( JAVA利用enum结合testng做数据驱动示例)

    数据驱动是做自动化测试中很重要的一部分,数据源的方案也是百花八门了,比如利用外部文件,直接在@DataProvider中写死等等,我们今天介绍一下利用enum来做数据源,先来看一下enum的写法: p ...

  8. MongoDB和Redis-NoSQL数据库-文档型-内存型

    1NoSQL简述 CAP(Consistency,Availabiity,Partitiontolerance)理论告诉我们,一个分布式系统不可能满足一致性,可用性和分区容错性这三个需求,最多只能同时 ...

  9. python 之 Django 基础篇

    1,Django流程介绍 MTV模式 著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据 ...

  10. hibernate中SessionFactory与Session的作用

    首先,SessionFactory是线程安全的,SessionFactory用到了工厂模式. 其创建和销毁需要耗费很大的资源,所以一个应用中的一个数据库一般只对应一个sessionfactory. S ...