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: ,