上一页 1 ··· 3 4 5 6 7 8 9 10 下一页
摘要: 前面写了一系列文章都是关于网络底层机制封装的,后面要慢慢的将这些机制组装起来,实现一套可用的网络库。既然是网络库,自然少不了对缓存的管理,本文实现一个带引用计数的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 ... 阅读全文
posted @ 2012-05-10 10:26 sniperHW 阅读(726) 评论(0) 推荐(0) 编辑
摘要: 非阻塞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(... 阅读全文
posted @ 2012-05-08 16:56 sniperHW 阅读(1044) 评论(3) 推荐(0) 编辑
摘要: 前几篇文章介绍了集中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.. 阅读全文
posted @ 2012-05-04 15:59 sniperHW 阅读(2612) 评论(1) 推荐(0) 编辑
摘要: lua中默认的number类型是double的,在游戏中很多数据类型用到了64位整型,虽然可以通过重定义lua_Number为__int64以支持64位整型,但这又丢失了对浮点数的支持.好在可以很方便的往lua中添加自定义的类型,我的需求很简单,可以支持两个i64,或1个i64和一个lua_Number的基本算术和关系运算就够了.extern int newI64(lua_State *L);static const struct luaL_Reg i64Lib[] = { {"new",newI64}, {NULL,NULL},};class Integer64{publ 阅读全文
posted @ 2012-04-26 11:23 sniperHW 阅读(8082) 评论(0) 推荐(1) 编辑
摘要: 前段时间写过一篇博客介绍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;//定义系统支持的最大套... 阅读全文
posted @ 2012-04-24 15:39 sniperHW 阅读(1016) 评论(2) 推荐(0) 编辑
摘要: 这是一个几年前写的对lua的访问封装,当时的项目仅提供了最基本的lua访问接口:调用lua函数,向lua注册标准格式的C++函数.本来我想引进luabind,但luabind相对又过于复杂,并不是所有功能都是我需要的,并且还要为此引入庞大boost.最终还是决定按需求编写一个简单的封装库.首先简单列一下我的需求:1)可以注册任意类型的C++函数到lua中2)可以方便的调用lua函数,方便的访问lua中的表3)可以访问lua中创建的对象,调用lua对象提供的方法4)注册C++类型到lua,使lua可以访问C++对象的字段,和函数下面介绍一下提供的一些API:1)call_luaFunction, 阅读全文
posted @ 2012-04-20 22:36 sniperHW 阅读(5552) 评论(10) 推荐(1) 编辑
摘要: 程序项目经常用到定时功能,如网络程序中,每隔固定的时间将发送缓冲中的数据一次性发往对端.下面介绍一个用posix timerfd实现的定时器, timerfd将定时器当做一个文件描述符,当定时器到时fd变为可读,可以将这个描述符交给epoll监听,timeout的时候由epoll返回并执行回调.timer.h#ifndef _TIMER_H#define _TIMER_H#define MAX_TIMER 4096typedef struct Timer *Timer_t;typedef void (*timer_callback)(Timer_t,void*);typedef struct 阅读全文
posted @ 2012-04-20 15:57 sniperHW 阅读(1865) 评论(5) 推荐(0) 编辑
摘要: 本篇贴出在上篇文章中介绍的模式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 阅读全文
posted @ 2012-04-09 13:53 sniperHW 阅读(2097) 评论(0) 推荐(1) 编辑
摘要: 本文并不打算介绍边界触发模式,需要了解的朋友自己到网上搜索.本文只是打算介绍近期总结的三种边界触发模式的实现方式,后面会实现每一种然后做一个性能比较.1)模仿windows完成端口的模式.这是最早的时候想到的一种方法,并且已经用C++实现过.大概结构这样的,定义了一个IO请求结构,类似于IOCP的OVERLAP结构:struct OVERLAP{ void *buf; int bytetransfer; int errcode;};然后是一个对应用不透明的socket结构:struct socket_t{ volatile int readable; volati... 阅读全文
posted @ 2012-04-07 19:24 sniperHW 阅读(2829) 评论(0) 推荐(1) 编辑
摘要: 以前写过一编博客介绍我们游戏的AI服务器。基本的结构就是利用windows的fiber,在每个fiber中运行一个lua虚拟机,具体的内容可以产参看http://blog.csdn.net/sniperhuangwei/article/details/5425471但这个方案有一个缺点,就是随着项目的推移,AI脚本变得越来越复杂,每个虚拟机占用的内存就变得越来越大。当一个进程上运行的AI对象数量很大时这个进程就吃掉了非常大的内存。经过一番考量,我决定不使用windows的fiber来支持用户态线程调度框架,而是改用lua的coroutine.这样整个进程只需要维护一个lua虚拟机就够了,即使A 阅读全文
posted @ 2012-04-02 09:40 sniperHW 阅读(3383) 评论(0) 推荐(2) 编辑
上一页 1 ··· 3 4 5 6 7 8 9 10 下一页