随笔分类 - 网络程序
摘要:最近闲来无事编写了一个异步redis客户端.为了测试其性能逐对redis和ssdb做了一次性能对比测试.首先介绍下测试环境,i5 4核心 3.6主频的台式机器,服务器客户断均运行在同一台机器上.测试内容是1000条hashtable数据,分别有两个属性chianfo和skill,每个属性存放100字...
阅读全文
摘要:我的新手游项目很快就要进入到寻找发行商的环节,最近几天相对较空闲,逐将工作重心转移到服务器组运维工具的制作上.回想一年之前经历的那个不算成功的端游项目,因为运维工具设计得不合理,使用十分不方便,游戏上线之后搞得我焦头烂额的.之前一直没碰过web相关的技术,最近几天猛看了下php和javascript...
阅读全文
摘要:首先简单介绍下distri.lua中的线程设计方案.distri.lua提供一个API函数fork用于创建新的C线程,这个C线程运行独立的lua虚拟机,为了在各线程之间通信每个线程都会创建一个channel,用于接收其它线程发送过来的消息.这个channel内部实现为单向链表,为了将channel的...
阅读全文
摘要:为了更好的体现luanet的设计意图和避免与网上另一个开源项目重名造成混淆, luanet正式更名为distri.lua.后需开发工作包括跨平台,日志,通过Fork创建新线程正在开发中.新地址:https://github.com/sniperHW/distri.lua
阅读全文
摘要:测试环境 intel-i5 双核 2.53HZ 服务器客户端均在本机运行测试内容:echo回射,每个包的字节数在20字节内luanet连接数 每秒回射数 1 19,000/s10 12,5000/s100 12,0000/s100...
阅读全文
摘要:luanet最初只是一个网络框架,它简单的封装了一些网络相关接口然后暴露到lua中,让lua可以构建简单的网络应用.随着我的手游服务器的开发,我发现在C语言中要实现一个简洁易用的RPC调用接口并不容易,于是开始考虑将整个服务器框架从主C,辅lua的模式转变成主lua,辅C的模式.网络通讯,异步日志等...
阅读全文
摘要:网游服务器大多提供了网关服务,用于作为用户和内部服务器组之间通信代理.网关服务一方面将用户消息从客户端分发到正确的内部服务器.另一方面将来自内部服务器的数据包转发给客户端.一般对于网关应用来说,压力最大的就是广播服务。一个用户的在游戏中产生的行为消息可能要广播给周数百个能看得见他的其它玩家.下面用kendynet编写一个简单的网关服务,当然这只是一个示例程序,它只是简单的把来自一连接的数据发往另一个连接.真实网络游戏中的网关服务要复杂得多.首先介绍一下基本设计,static msgdisp_t disp_to_server;static msgdisp_t disp_to_client;s..
阅读全文
摘要:最近一段时间将原来写的kendynet网络框架重写了大部分的代码,让提供的接口更清晰,对用户更友好。整个框架的架构分层3层:1)单线程,基于原始数据流的网络接口,在这一层上,没有提供封包的处理,定时器事件等等。使用者可以在此之上按自己的需求做进一步的封装。2)单线程,提供connection,封包处理,接收发送超时处理。3)网络逻辑分离的异步网络框架,抽象出三个主要的类型:asynnet_t,sock_ident和msgdisp_t.asynnet_t:网络处理引擎,使用者创建实例的时候可以传入pollercount参数,其中每一个poller都会在单独的线程中运行.sock_ident:逻辑
阅读全文
摘要:前面的文章介绍了一个基于微线程的调度器框架,并测试了使用微线程实现远程调用的效率。本文将微线程和网络事件框架结合起来,在微线程中处理所有的事件(网络消息,用户定时器事件),这样,在事件回调函数中可以放心的发起远程调用而不用担心阻塞整个线程,只要还有未被阻塞的微线程,就可以切换到那个微线程上去执行,继续等待在事件队列上处理新到的事件.typedef struct coronet{ netservice_t nets; msg_loop_t msgl; sche_t coro_sche; uint32_t last_check...
阅读全文
摘要:前面有几篇文章介绍过一个基于linux epoll的网络接口,但并未将接口组合成一个方便使用的网络框架。下面先简单介绍下以前发布过的网络接口:首先是基本接口:KendyNet.h KendyNet.c https://github.com/sniperHW/kendylib/blob/master/include/KendyNet.h此接口提供了最简单的单线程网络收发模型,并未提供封包解包等功能,使用者可在此之上根据自己的需求封装出合适的网络框架第二组接口在第一组接口上提供了封包和解包:Connection.h Connectionchttps://github.com/sniperHW/ke
阅读全文
摘要:为了在各线程之间高效的传递消息,必须设计一种高效率的消息队列,传统的做法是mutex加queue,这种做法在每次执行push和pop时都要加锁,效率相对较低。其次还有使用循环队列,可以做到完全无锁,但只能实现1:1的消息传递。还有一些lock-free队列的实现,但基于其实现的相对复杂性,我不打算使...
阅读全文
摘要:将用户级线程添加到我的工具库中,主要的目的就是用于实现同步远程调用接口。这里的同步,是指在调用返回或超时之前,用户级线程的执行路径阻塞在调用接口上,但其底层的线程并不会阻塞,可以继续其它的工作。基于这个结构,我的服务器主线程将运行一个用户级线程调度器,并预先创建一组用户级线程池。当收从网络层收到一个网络消息时,从线程池中取出一个空闲的线程,将消息交给它处理。这个线程在执行的过程中如果发生了阻塞调用,就将运行权交换给调度器,由调度器挑选下一个可用的线程执行。阻塞线程直到超时,或被通知可以解除阻塞才被重新投入到调度器的可运行队列中。下面贴出一个简单的测试代码,用于测试调用的效率。首先是两个远程函数
阅读全文
摘要:KendyNet for linux的测试程序已经写好,项目地址:https://github.com/sniperHW/kendylib因为本人的工作环境下没有linux的机器,只是在两台服务器上安装了linux的虚拟机测试,效果并不是太好,有条件的同学可以下载代码,帮助测试一下.
阅读全文
摘要:这几天编写了一个测试程序,测试我的网络库(KendyNet for Windows)的性能,主要用于模拟大量玩家在同一区域内,互相可见情况下网络的压力情况.测试环境:客户机和服务器 E5520 4GB windows 2008 server千兆网.客户机启动一个进程,建立360个连接到服务器,模拟360个客户端,每个客户端每秒发送16个28字节的封包,服务器收到每个封包都将其转发给所有的360个客户端.处理能力是每秒接收6000+,转发220W+,CPU占满单个核心,内存占用8M左右,封包一个来回的平均延时在46ms左右.这已经达到了最大处理能力,再加连接就开始导致性能下降,内存消耗暴增.ht
阅读全文
摘要:本文贴出用C语言重写的网络封包,主体设计思路前文已经介绍过,就是尽可能的共享缓存,减少不必要的内存拷贝.其次,封包主要是为了适合网络游戏等有固定模式的,面向字节流的协议,所以并不适合用于http类协议的处理.最后,代码没有做优化,内存的分配都是经由calloc,后面会用内存池代替。项目地址:https://github.com/sniperHW/KendyNet/tree/master/IOCPrpacket从网络中接收到的数据封包:#ifndef _RPACKET_H#define _RPACKET_H#include "buffer.h"typedef struct r
阅读全文
摘要:前面写了一系列文章都是关于网络底层机制封装的,后面要慢慢的将这些机制组装起来,实现一套可用的网络库。既然是网络库,自然少不了对缓存的管理,本文实现一个带引用计数的buffer,作为packet的底层缓存组件.packet的具体设计思路可见:http://www.cnblogs.com/sniperHW/archive/2012/04/02/2429625.htmlhttp://www.cnblogs.com/sniperHW/archive/2012/04/02/2429629.html#ifndef _BUFFER_H#define _BUFFER_H/* Copyright ...
阅读全文
摘要:非阻塞Accept和Connect的封装器,WINDOWS版本acceptor#ifndef _ACCEPTOR_H#define _ACCEPTOR_Htypedef struct acceptor* acceptor_t;typedef void (*on_accept)(SOCKET);acceptor_t create_acceptor(const char *ip,unsigned long port,on_accept accept_callback);void destroy_acceptor(acceptor_t*);void acceptor_run(...
阅读全文
摘要:前几篇文章介绍了集中linux epoll的封装方式,本篇回归windows,介绍一个IOCP的封装。首先介绍要达到的目的:1) 导出基本接口,作为一个更高层跨平台网络库的基础组件2) 导出的接口用法与epoll版本大致相当,以方便日后的跨平台封装3) 默认的使用方式是单线程的,与epoll一致。下面是接口文件:/* Copyright (C) <2012> <huangweilook@21cn.com> This program is free software: you can redistribute it and/or modify it under the..
阅读全文
摘要:前段时间写过一篇博客介绍epoll边界触发模式的三种实现模式,并在http://www.cnblogs.com/sniperHW/archive/2012/04/09/2438850.html中贴出了前面两种的实现代码,今天将介绍第三种模式,也就是每线程执行一个epoll主循环的方式.首先贴出接口的API:#ifndef _KENDYNET_H#define _KENDYNET_Htypedef struct list_node{ struct list_node *next;}list_node;#define LIST_NODE list_node node;//定义系统支持的最大套...
阅读全文
摘要:本篇贴出在上篇文章中介绍的模式1的实现代码.首先,因为是多线程的程序,必须防止某一资源在一个线程中使用的时候,却在另一个线程中释放了.其中最主要的便是socket_t结构,为了杜绝这个问题,对应用层来说,应该根本不知道socket_t的存在,仅仅提供一个HANDLE给应用层就足够了.#ifndef _KENDYNET_H#define _KENDYNET_H#include "MsgQueue.h"typedef struct list_node{ struct list_node *next;}list_node;#define LIST_NODE list_node n
阅读全文