Mar 23

网络程序和单机程序(指进程内)有很大的相同点. 进程内程序的函数调用, 编译器把参数的传递隐藏了, 参数被序列化到栈上. 但对于网络程序, 一般需要开发者处理参数的编码和解码, 从带字节数组解码出参数, 或者将参数编码进字节数组.

有很多协议被用来做参数的编码和解码, 但有一种位置相关的编码方式比较常见, 而且速度快. 比如带有指令的字节数组, [0-3]字节是一个整数, 表示指令的类型, [4-8]字节是每一个整数参数, 如此.

C语言中有处理这些参数传递的惯用法. 下面介绍其中一种.

为每一种指令定义一个结构体(struct), 并定义 encode 和 decode 两个函数, 用于序列化和反序列化参数列表. 这样, 程序大概会看起来这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// file: args.h
// 参数定义
 
struct a_args{
    ...
};
 
int encode_a_args(char *p, struct a_args* args);
int decode_a_args(char *p, struct a_args* args);
 
struct b_args;
...
 
// file: proc.c
// 指令处理过程
 
int proc_a(struct a_args* args);
int proc_b(struct b_args* args);
...
 
// file: main.c
// 程序入口
char *p;
while((p= read_cmd()) != NULL){
    int type = *((int*)p);
    switch(type){
        case TYPE_A:
            decode_a_args(...);
            proc_a(...);
            break;
        ...
    }
}

Written by benegg at 2009-03-23 19:51:24 | tags: ,

Feb 04

benegg.com开始了!

网络游戏引擎技术

关注除了界面, 音乐, 游戏性之外的网络游戏引擎技术, 主要是网络游戏的网络和结构.

Lighttpd源码分析

Lighttpd是一个轻量级的Web服务器(Web Server), 它的代码量很少, 只有不到2MB. 相比Apache, 相对更容易学习. 随着Lighttpd的应用越来越广泛, 其定制需求会越来越多.

Lua源码分析

因为Lua源码体积小, 核心模块很少, 所以我选中了Lua. 相关的考虑是JavaScript, PHP, Python. 到目前为此, 我还未看过Lua的源码, 也未写过Lua的”Hello World”程序, 而且, 我不喜欢Lua的语法, 因为它不是类C的. 我想有一种类C语法的Lua.

Written by benegg at 2009-02-04 12:00:07