最近一段时间将原来写的kendynet网络框架重写了大部分的代码,让提供的接口更清晰,对用户更友好。

整个框架的架构分层3层:

1)单线程,基于原始数据流的网络接口,在这一层上,没有提供封包的处理,定时器事件等等。使用者可以在此之上按自己的需求做进一步的封装。

2)单线程,提供connection,封包处理,接收发送超时处理。

3)网络逻辑分离的异步网络框架,抽象出三个主要的类型:asynnet_t,sock_ident和msgdisp_t.

asynnet_t:网络处理引擎,使用者创建实例的时候可以传入pollercount参数,其中每一个poller都会在单独的线程中运行.

sock_ident:逻辑层操作的套接口封装,可以安全的在多线程环境下使用.

msgdisp_t:消息分离器,每个分离器有一个对应的消息队列用于接收从网络线程传递过来的消息.

msgdisp_t提供了两种使用模式:

第一种:典型的线程池模式。在这种模式下,可以创建一个消息分离器,多个逻辑线程对这个消息分离器调用

msg_loop.

第二种:共用网络层模式。在一个进程中启动N个线程,每个线程运行一个不同服务,所有这些服务共用网络通信层.

在这种情况下,网络消息需要路由到正确的服务那里.可以每个线程都创建一个消息分离器,各线程在自己的消息分离器上

调用msg_loop处理只属于自己的消息.

下面是一个异步网络服务器的示例:

#include <stdio.h>
#include <stdlib.h>
#include "core/msgdisp.h"
#include "testcommon.h"uint32_t recvsize = 0;
uint32_t recvcount = 0;///int32_t asynnet_bind(msgdisp_t disp,sock_ident sock,void *ud,int8_t raw,uint32_t send_timeout,uint32_t recv_timeout)
void asynconnect(msgdisp_t disp,sock_ident sock,const char *ip,int32_t port)
{printf("asynconnect\n");disp->bind(disp,sock,1,0,30*1000);
}void asynconnected(msgdisp_t disp,sock_ident sock,const char *ip,int32_t port)
{printf("asynconnected\n");++client_count;
}void asyndisconnected(msgdisp_t disp,sock_ident sock,const char *ip,int32_t port,uint32_t err)
{--client_count;
}int32_t asynprocesspacket(msgdisp_t disp,sock_ident sock,rpacket_t rpk)
{recvsize += rpk_len(rpk);recvcount++;asyn_send(sock,wpk_create_by_other((struct packet*)rpk));return 1;
}void asynconnectfailed(msgdisp_t disp,const char *ip,int32_t port,uint32_t reason)
{}int main(int argc,char **argv)
{setup_signal_handler();InitNetSystem();asynnet_t asynet = asynnet_new(1);msgdisp_t  disp = new_msgdisp(asynet,asynconnect,asynconnected,asyndisconnected,asynprocesspacket,asynconnectfailed);int32_t err = 0;disp->listen(disp,argv[1],atoi(argv[2]),&err);uint32_t tick,now;tick = now = GetSystemMs();while(!stop){msg_loop(disp,50);now = GetSystemMs();if(now - tick > 1000){uint32_t elapse = now-tick;recvsize = (recvsize/elapse)/1000;printf("client_count:%d,recvsize:%d,recvcount:%d\n",client_count,recvsize,recvcount);tick = now;packet_send_count = 0;recvcount = 0;recvsize = 0;}}CleanNetSystem();return 0;
}

项目代码在:https://github.com/sniperHW/luanet

目前只实现了对linux,tcp的网络支持,后续将会先完善这部分代码,并在此之上提供基于user level thread的RPC支持.

转载于:https://www.cnblogs.com/sniperHW/p/3517767.html

异步网络消息处理框架相关推荐

  1. java http 异步请求框架_GitHub - huangdali/MyHttpUtils: 一个非常好用的异步网络请求框架...

    轻量级网络请求框架MyHttputils 一.前言 本版代码大换血,使用了策略模式和构造模式来组织代码,增加了更加人性化的请求构造,代码质量提高.效率显著提升.(但是使用风格基本没变哦) 2.0.2版 ...

  2. Android之封装好的异步网络请求框架

    1.简介  Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnection,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使 ...

  3. 爬虫(9) - Scrapy框架(1) | Scrapy 异步网络爬虫框架

  4. Android主流网络请求框架

    一.Volley google推出的异步网络请求框架和图片加载框架.特别适合数据量小,通信频繁的网络操作.android绝大多数都属于这种类型,但是对于数据量比较大的操作,比如:下载,就不太适用了. ...

  5. python异步网络通信框架_超级快的 Python 异步网络框架

    简短介绍 asyncio是遵循Python标准库的一个异步 I/O框架.在这篇文章里,我将介绍 uvloop: 可以完整替代asyncio事件循环.uvloop是用Cython写的,基于 libuv. ...

  6. python网络开发框架_greenev首页、文档和下载 - Python网络服务框架 - OSCHINA - 中文开源技术交流社区...

    greenev是一个基于greenlet协程,事件驱动,非阻塞socket模型的Python网络服务框架,它使得可以编写同步的代码,却得到异步执行的优点.reactor模式采用基于epoll, kqu ...

  7. 基于redis AE异步网络架构

    最近的研究已redis源代码,redis高效率是令人钦佩. 在我们的linux那个机器,cpu型号, Intel(R) Pentium(R) CPU G630 @ 2.70GHz  Intel(R) ...

  8. ajax async:false不管用_js 网络请求框架 ajax和axios、fetch的区别

    互联网行业发展至今出现了很多技术,技术都在与时俱进的更新中,如从前的前端技术栈(html4+js+css+jquery)到现在vue+axios.随着更多优秀的框架出现,让我们从重复的基础代码编写中解 ...

  9. Android应用中使用AsyncHttpClient来异步网络数据

    首先下载AsyncHttpClient的库文件,可以自行搜索,可以到下面地址下载 http://download.csdn.net/detail/xujinyang1234/5767419 测试的Ac ...

最新文章

  1. 技术架构的战略和战术原则
  2. 在 Excel 2016 for Windows 中启用 Power View
  3. 人工智能技术在互联网医疗中的应用
  4. 如何批量转化成jpg格式_heic图片格式快速转换jpg,批量转换方法
  5. java容器详解_详解Java 容器(第①篇)——概览
  6. python中排序的函数_Python中sorted()排序函数
  7. 数据库 - 库表操作 - 存储引擎
  8. python调用opencv的速度_OpenCV-Python系列之OpenCV性能衡量与优化方法
  9. python二维向量运算_python中二维数组的Elementwise与or或运算
  10. cesium 基于在vue框架写功能
  11. VMware11.1.2+centOS7.4虚拟机联网问题并设置静态IP
  12. 【回溯】有蹩脚的马踏棋盘——思路巨清晰!!!
  13. loj534. 「LibreOJ Round #6」花团
  14. Activity简单几步支持向右滑动返回
  15. 图片切换上一页 下一页
  16. JavaScript是单线程还是多线程?
  17. 如何做一个简单的XX(学生/图书馆)管理系统(一)
  18. 怎么做成html网页,html网页制作的基本步骤?怎么用html做一个网页?
  19. jsp+servlet实现个人博客系统
  20. 《统计学》笔记:第11章 一元线性回归

热门文章

  1. oracle正则匹配全部,sql – 返回Oracle中正则表达式的所有匹配项
  2. Lucas定理及组合数取模
  3. uva 437——The Tower of Babylon
  4. 665. 非递减数列 golang 切片越界问题的探讨(二)
  5. 《C++ Primer 第五版》(第1~6章总结)
  6. Java简单输入输出
  7. 汇编语言的相对跳转和绝对跳转以及反汇编代码解析
  8. 996页阿里Android面试真题解析火爆全网,全网首发!
  9. CRM公海自动回收规则
  10. itcast-ssh-crm实践