|
Mar 23
|
C语言网络程序惯用法-参数传递
-未分类
Views: 4127 |
No Comments »
|
网络程序和单机程序(指进程内)有很大的相同点. 进程内程序的函数调用, 编译器把参数的传递隐藏了, 参数被序列化到栈上. 但对于网络程序, 一般需要开发者处理参数的编码和解码, 从带字节数组解码出参数, 或者将参数编码进字节数组.
有很多协议被用来做参数的编码和解码, 但有一种位置相关的编码方式比较常见, 而且速度快. 比如带有指令的字节数组, [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; ... } } |

Recent Comments