iocp服务器客户端混合框架

  • Y5_268563
    了解作者
  • 5.3KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-06-04 12:48
    上传日期
//一个简单的使用例子 //连接远程服务器成功 或 接收到一个远程连接时,本函数将会被ioc.dll回调.在本函数中,应该向客户端列表中添加节点,记得加锁 // //2.s :套接字句柄,标志着一个新的连接 //3.u_addr:对端的IP地址,网络字节序 //4.u_port:对端的端口号,网络字节序 //5.flag :如果是本地连接上了一个远程服务器,flag值为0,或者,是接收到一个远程客户端的连接,这时,flag值为1 //6.返回值:返回一个自定义的值,这个值将在其他回调函数中作为参数传递(注意:就如套接字句柄一样,这个值也最 //好能标志一个连接,比如,客户端列表的某个节点的指针,假设用STL中的MAP来维护客户端列表,那么用KEY作为返回值也不错。) long _stdcall ioc_call_connect(HIOC hIoc,HINT s,long u_addr,long u_port,long flag) { long res=0; printf("socket(%d) connected\n",s); return res; } //断开与远程服务器的连接 或 远程客户端断开,本函数将会被ioc.dll回调.在本函数中,你可以删除客户节点,记得加锁 //s :套接字句柄,标志着哪个连接断开了(在本回调函数返回之前,套接字句柄s不可能被重新利用,所以,用s作为关键字构建客户端列表也是没有问题的) //res:ioc_call_connect回调函数返回的那个值,如果它是客户端列表的某个节点的话,那么可以删除了。 void _stdcall ioc_call_disconnect(HIOC hIoc,HINT s,long res,long flag) { printf("socket(%d) disconnected\n",s); } //当ioc内部一收到数据就会回调本函数,所谓数据有可能是多个数据包,也有可能是一个不完整的数据包 //hIoc,s,flag都不再多做解释 //res :ioc_call_oprate_dat和ioc_call_disconnect一定是被线性回调的,不可能存在同时执行的情况,所以,res如果指向某个节点的话,在本函数中可以不加锁地尽情访问,在本函数返回之前,res不会被释放掉 //hArg:数据调度句柄 //data:数据 //len :数据大小 //返回值:返回剩余未处理完的字节数 long _stdcall ioc_call_oprate_dat(HIOC hIoc,HARG hArg,HINT s,long res,long flag,char *data,long len) { //假如数据包格式是这样: //struct DATAPACK //{ // long size; long cmd; ...... //}; //如果是这样的话,那么典型的处理方法如下: char *p=data; long size_res=len;//收到数据的总字节数 long size_per;//其中某一个数据包的字节数 while(1) { if(size_res<4) return size_res;// size_per=*(long*)(p+0x00);//取数据包的实际长度 if(size_per<0 || size_per>某个最大值) { ::iocCommon_CloseSocket(hIoc,s); return 0; } if(size_res<size_per) return size_res;//剩余数据不够一个完整的数据包,返回 //得到一个完整的数据包,可以就地处理,但如果处理这个数据包将会很耗时,那么为了不阻塞工作线程, //只好将其调度给数据处理线程,这里其实可以定义一个结构,除了将数据包调度出去,还可以附带一些其他信息 if(数据包处理起来比较简单) { //处理 } else//调度给数据处理线程 { char *msg=(char*)::malloc(len); ::memcpy(msg,p,size_per); ::iocCommon_DispatchMessage(hIoc,hArg,msg);//hArg就只有这么一个作用 } p+=size_per; size_res-=size_per; } } //阻塞数据处理线程回调函数 void _stdcall ioc_call_oprate_msg(HIOC hIoc,void *msg) { //处理数据包 ::free(msg);//根据谁分配谁释放的原则,释放msg } int main() { ::iocCommon_Startup(); long addr_con=(long)ioc_call_connect; long addr_dis=(long)ioc_call_disconnect; long addr_dat=(long)ioc_call_oprate_dat; long addr_msg=(long)ioc_call_oprate_msg;//这个参数是可选的,可以不要专门的阻塞数据处理线程 HIOC hIoc=::iocCommon_Create(3072,128,addr_con,0,addr_dis,0,addr_dat,0,addr_msg,0);//创建IOC ::iocCommon_SetOprateThread(hIoc);//增加一个工作线程 ::iocCommon_SetOprateThread(hIoc);//增加一个工作线程 //启动服务器,内部循环调用阻塞的accept函数,ioc不考虑客户端连接服务器有多困难,而只考虑如何高效地进行数据传输 //可以再创建几个线程,多调用几个iocServer_Start,各个iocServer_Start绑定不同端口也可以 ::iocServer_Start(hIoc,NULL,6800); ::iocCommon_Cleanup(); return 0; }
ioc.rar
  • ioc
  • ioc.h
    2.7KB
  • ioc.lib
    4KB
  • ioc.dll
    20KB
内容介绍
/************************************************************************************************* IOC相关协议 1 发送数据必须调用iocCommon_Send函数,自己调用套接字函数发送会破坏IOC的引用计数 2 C语言使用IOC时,所有回调函数必须指定_stdcall调用约定 3 C++使用IOC时,所有回调函数必须使用_thiscall调用约定,也就是C++默认的调用约定 *************************************************************************************************/ /************************************************************************************************* 回调函数 1.flag : 如果s代表客户端,flag为0,否则为1 3.返回值: 返回自定义的一个值(可以是一个指针) long ioc_call_connect(HIOC hIoc,HINT s,long u_addr,long u_port,long flag); 1.res : 自定义的一个值 2.flag: 如果s代表客户端,flag为0,否则为1 void ioc_call_disconnect(HIOC hIoc,HINT s,long res,long flag); 1.hArg: 消息调度句柄 2.res : 自定义参数,与套接字相关联 3.flag:如果s代表客户端,flag为0,否则为1 4.返回值: 返回剩余未处理的字节数 long ioc_call_oprate_dat(HIOC hIoc,HARG hArg,HINT s,long res,long flag,char *data,long len); 1.data:数据 void ioc_call_oprate_msg(HIOC hIoc,void *msg); *************************************************************************************************/ #define iocExport extern "C" __declspec(dllexport) typedef unsigned int HINT; typedef unsigned long *** HIOC; typedef unsigned long *** HARG; iocExport void iocCommon_Startup(); iocExport void iocCommon_Cleanup(); //创建IOC //max_data_len:数据包的最大长度 //max_user_count:所能管理的最大连接数量(预估值) //addr_dat:数据包处理回调函数地址(如果用C方式使用该函数,申明为_stdcall) //this_dat:数据包处理回调函数所属对象的this指针(如果用C方式使用该函数,设置为0) iocExport HIOC iocCommon_Create(long max_data_len,long max_user_count, long addr_con,long this_con, long addr_dis,long this_dis, long addr_dat,long this_dat, long addr_msg,long this_msg); //关闭完成端口 iocExport void iocCommon_Delete(HIOC hIoc); //增加一个工作线程 //flag:如果为TRUE,ioc将自动为工作线程创建一个相对应的数据处理线程 iocExport void iocCommon_SetOprateThread(HIOC hIoc); //减少一个工作线程 iocExport void iocCommon_SubOprateThread(HIOC hIoc); //将数据调度给处理线程 iocExport void iocCommon_DispatchMessage(HIOC hIoc,HARG hArg,void *data); //发送数据 //pc :连接数据指针 //data:数据包 //len :数据包长度 iocExport void iocCommon_Send(HIOC hIoc,HINT s,char *data,long len); //断开连接 iocExport void iocCommon_CloseSocket(HIOC hIoc,HINT s); //建立一个与服务器的连接,并将连接与IOC绑定 //addr:远程地址 //port:远程端口 iocExport int iocClient_Start(HIOC hIoc,char *addr,long port); //启动服务器,此函数将阻塞当前线程 //addr:本地地址,可以为NULL //port:本地端口 iocExport int iocServer_Start(HIOC hIoc,char *addr,long port);
评论
    相关推荐
    • GaussDB_100_1.0.1-DATABASE-REDHAT-64bit.tar.gz
      guassdb100在redhat上安装包,单机部署的包,安装步骤请看我的文中介绍,经过大量实验搭建总结出来的文档
    • 卷积神经网络
      这是卷积神经网络的一个实际用例,已经调试好了,能够在matlab上成功运行,适合从事卷积神经网络(CNN)研究的人员学习使用。
    • SIM800C_MQTT.rar
      使用SIM800C模块,使用MQTT协议,连接中国移动onenet平台,能实现数据的订阅、发布、存储等
    • android从bootloader到launcher启动流程整理
      讲述android 开机流程 从boot rom---bootloader---init--zygote---systemserver---ams 并附上自己整理的每个流程的流程图 ,清晰熟悉android 启动流程
    • Aerosim Blockset
      The AeroSim aeronautical simulation blockset provides a complete set of tools for the rapid development of nonlinear 6-degree of freedom aircraft dynamic models. In addition to the basic aircraft dynamics blocks, the library also includes complete aircraft models which can be customized through parameter files.
    • 微电网PSO优化算法
      微电网的粒子群优化调度算法,里面包括相关文献参考和电价数据,算法的过程解释的很清楚,是我学算法时候用到的资源。
    • 分数阶混沌系统:分数阶混沌系统的数值解。-matlab开发
      该工具箱包含可用于模拟一些著名的分数阶混沌系统的函数,例如: - 陈的系统, - Arneodo的系统, - Genesio-Tesi 的系统, - 洛伦兹系统, - 牛顿-莱普尼克系统, - 罗斯勒的系统, - Lotka-Volterra系统, - 达芬的系统, - 范德波尔的振荡器, -伏打的系统- 陆氏系统, - 刘的系统, - Chua的系统, - 金融系统, - 3 细胞 CNN。 这些函数以数值方式计算描述混沌系统的分数阶非线性微分方程的解。 每个函数返回总模拟时间的状态轨迹(吸引器)。 更多详情请看书: Ivo Petras,分数阶非线性系统:建模、分析和仿真,Springer,系列:非线性物理科学,2011,ISBN 978-3-642-18100-9。 http://www.springer.com/engineering/control/book/978-3-
    • matlabpam代码-dsp-library:用于光通信的MATLABDSP函数库
      matlab pam代码 DSP库 该项目包含几种不同的功能,可将DSP算法应用于光通信。 这些功能适用于相干和非相干(PAM,DMT)光通信。 大多数功能是相互独立的。 因此,该代码中的功能可以轻松使用,并与其他DSP功能结合使用。 用法 功能列表以及简短说明在文件中。 输入和输出参数的描述在每个函数的标题中。 讯号 通常,输入(和输出)信号在第一维度上具有时间(例如,列向量),而第二维度用于一次管理多个信号(例如,不同的极化,不同的参数等)。 之所以选择这种约定,是因为MATLAB通过将列保留在内存的连续部分中来存储矩阵,因此,这种约定比其他方法(行向量)要快。 参数 大多数功能使用参数结构作为输入参数。 函数中使用的参数的描述通常在标头中,而coherent-dsp函数的默认参数在文件中。 参考 执照 此代码在下发布。
    • 有关多目标跟踪的PHD滤波的一些资料
      一些关于多目标跟踪的新的文献,主要是有关概率假设密度(PHD)的
    • 雷达目标跟踪程序合集.zip
      雷达目标跟踪相关程序,CA运动模型,CT运动模型,IMM交互多模型,卡尔曼滤波,粒子滤波PF,概率数据互联JPDA等算法程序相互结合,实现密集杂波环境目标跟踪和高机动目标跟踪....