异步网络消息处理框架

最近一段时间将原来写的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 关键字—— static 与 final

static表示“全局”或者“静态”的意思&#xff0c;用来修饰成员变量和成员方法&#xff0c;也可以形成静态static代码块&#xff0c;但是Java语言中没有全局变量的概念。 被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说&#xff0c;它不依赖类特定的实例&am…

Linux 小记录

<1>bzero 原型&#xff1a;extern void bzero(void *s, int n);用法&#xff1a;#include <string.h> 功能&#xff1a;置字节字符串s的前n个字节为零。 说明&#xff1a;bzero无返回值。 LINUX平台支持bzero的&#xff0c;但是其并不在ANSI C中定义&…

平面设计师的自我修养是什么样子的?

首先让我们来定义设计的概念&#xff0c;因为这是一切后续讨论的基础。我认为比较适用的定义是&#xff1a;赋予自然或社会中的资源或元素以新的秩序&#xff0c;从而来解决特定的问题。我不想用诸如“设计是人类区别动物的属性”这类未经实证的乱贴标签的话来强调设计的重要性…

Java 三大特性之——继承

继承(inheritance)是面向对象的重要概念。继承是除组合(composition)之外&#xff0c;提高代码重复可用性(reusibility)的另一种重要方式。我们在组合(composition)中看到&#xff0c;组合是重复调用对象的功能接口。我们将看到&#xff0c;继承可以重复利用已有的类的定义。 类…

基于Linux的 Open×××网络之网络架构应用实例

基于Linux的 Open网络之网络架构应用实例Open 概述Open 是一个开源的加密隧道构建工具&#xff0c;基于 OpenSSL 的 SSL/TLS 协议&#xff0c;可以在 Internet中实现点对点的 SSL 安全连接。使用 Open 的好处是安全、易用和稳定&#xff0c;且认证方式灵活&#xff0c;具备实现…

Java 进阶——自动装箱和自动拆箱

1、什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。 一般我们要创建一个类的对象实例的时候&#xff0c;我们会这样&#xff1a; Class a new Class(parameter); 当我们创建一个Integer对象时&#xff0c;却可以这样&…

基于KVM的虚拟化研究及应用

引言 虚拟化技术是IBM在20世纪70年代首先应用在IBM&#xff0f;370大型机上&#xff0c;这项技术极大地提高了大型机资源利用率。随着软硬件技术的迅速发展&#xff0c;这项属于大型机及专利的技术开始在普通X86计算机上应用并成为当前计算机发展和研究的一个热点方向。目前&am…

Java 进阶—— super 和 this 的用法

一、this Java关键字this只能用于方法方法体内。当一个对象创建后&#xff0c;Java虚拟机&#xff08;JVM&#xff09;就会给这个对象分配一个引用自身的指针&#xff0c;这个指针的名字就是this。因此&#xff0c;this只能在类中的非静态方法中使用&#xff0c;静态方…

谨慎设计一个单例类

如果设计成一个单例类&#xff0c;虽然不存在对象频繁回收&#xff0c;可要长期占用资源。而且意味着外面对多线程&#xff0c;到了这里需要排队进入。什么时间设计成单例呢&#xff1f;设计一个单例就意味着&#xff0c; 我们存在资源竞争&#xff0c;必须的&#xff0c;二&am…

unity中脚本编辑器UnIDE

引言 unity默认脚本编辑器是MonoDevelop&#xff0c;随着unity4.3面世&#xff0c;MonoDevelop (4.0.1)版本也随之而来&#xff0c;更新为界面更改和bug自动修复功能等&#xff0c;具体还未使用。 点击unity的Edit下的属性(preference)&#xff0c;可以更改默认脚本编辑器&…

apk,task,进程区别

2019独角兽企业重金招聘Python工程师标准>>> apk&#xff0c;task&#xff0c;进程区别 apk一般占一个dalvik,一个进程&#xff0c;一个task。通过设置也可以多个进程,占多个task。 task是一个activity的栈&#xff0c;其中"可能"含有来自…

Java 线程 —— 基础篇

一、操作系统中线程和进程的概念 现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。 进程是指一个内存中运行的应用程序&#xff0c;每个进程都有自己独立的一块内存空间&#xff0c;一个进程中可以启动多个线程。比如在Windows系统中&#xff0c;一个运行的exe…

【Java并发性和多线程】线程安全及不可变性

2019独角兽企业重金招聘Python工程师标准>>> 本文为转载学习 原文链接&#xff1a;http://tutorials.jenkov.com/java-concurrency/thread-safety-and-immutability.html 译文链接&#xff1a;http://ifeve.com/thread-safety-and-immutability/ 当多个线程同时访问…

Java 高级—— IO 基础

一、File 类 先看一下File 类的定义 [java] view plaincopy public class File extends Object implements Serizliable Comparable<File> 从定义看&#xff0c;File类是Object的直接子类&#xff0c;同时它继承了Comparable接口可以进行数组的排序。 File类的操作包括…

安装 SharePoint 2013 Foundation

一、Foundation版本的区别Foundation版本的区别见附件&#xff08;英文&#xff09;。官网下载地址 http://www.microsoft.com/zh-cn/download/details.aspx?id35488二、安装必备软件三、独立安装模式1. 启动安装向导2. 接受软件许可条款3. 选择服务器类型和数据位置4. 结束安…

Java 异常处理机制

异常处理是程序设计中一个非常重要的方面&#xff0c;也是程序设计的一大难点&#xff0c;从C开始&#xff0c;你也许已经知道如何用if...else...来控制异常了&#xff0c;也许是自发的&#xff0c;然而这种控制异常痛苦&#xff0c;同一个异常或者错误如果多个地方出现&#x…

架构师未来性的基础:简单性

作者&#xff1a;高焕堂&#xff0c;misoo.twqq.com 首页&#xff1a;Backee e架构师未来性的基础&#xff1a;简单性 Apple公司创始人乔布斯(Steve Jobs)曾说到&#xff1a;“简单比复杂更难&#xff0c;你必须努力让你的想法变得清晰…

Android 基础—— 对Context的理解与使用技巧

一、Context 基础概念 1、什么是Context 1) Context是一个抽象类&#xff0c;其通用实现在ContextImpl类中。 2) Context&#xff1a;是一个访问application环境全局信息的接口&#xff0c;通过它可以访问application的资源和相关的类&#xff0c;其主要功能如下&a…

函数可微的一个充分条件

设函数 $f:\bbR^n\to \bbR$ 在 $\bbR^n\bs \sed{0}$ 可微, 在 $0$ 连续, 且 $$\bex\lim_{\bbx\to0}\frac{\p f(\bbx)}{\p x_i}0,\ i1,2,\cdots,n. \eex$$ 证明 $f$ 在 $0$ 可微. 证明: 由 $$\beex \bea |f(\bbx)-f(0)| &\leq |f(x_1,x_2,\cdots,x_n)-f(0,x_2,\cdots,x_n)|…

Android 四大组件 —— 广播(广播机制解析)

在网络通信中&#xff0c;一个IP网络范围中最大的IP 地址是被保留作为广播地址来使用的。比如某个网络的IP 范围是192.168.0.XXX&#xff0c;子网掩码是255.255.255.0&#xff0c;那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一网络上的所有端口&#xff…