文件ipv4_parse.c是整个程序的核心,它由几个函数组成,这些函数给出了供驱动文件main.c调用的底层解析功能。函数ipv4_parse_sv主要用于解析单个数值。首先,该函数检查这个值是否是通配符或者其长度是否正确。其次,用for循环进行迭代,并将结果值保存在m_state数组中。函数ipv4_parse_r通过识别高值和低值,来确定IP地址的范围。函数ipv4_parse_tok的作用是确定被检查的数值中是否含有-字符,确定该值是表示一个地址范围还是表示一个或多个独立地址的列表。用逗号分隔的数值表示IP地址包含了一个数值列表,而不是范围,函数ipv4_parse_octet用于解析这种数值。IP地址通常用于点分十进制记数法来表示,由4个字节数字串组成,这4个字节通常用小数点分隔。函数ipv4_ctx_init创建4个数组来放置已解析的IP地址。ipv4_ctx_init函数通过移动到点分十进制记数法的下一个数字来协助解析过程。函数ipv4_next_addr用于迭代先前解析出来的数据。
1 /*
2 * main.c
3 *
4 */
5
6 #include <stdio.h>
7 #include "ipv4_parse.h"
8
9 int
10 main(int argc, char *argv[])
11 {
12 ipv4_parse_ctx ctx; // context to hold state of ip range
13 unsigned int addr = 0;
14 int ret = 0;
15
16 if(argc != 2)
17 {
18 printf("usage: %s ip_range\r\n", argv[0]);
19 return(1);
20 }
21
22 // perform initial parsing of ip range
23 ret = ipv4_parse_ctx_init(&ctx, argv[1]);
24 if(ret < 0)
25 {
26 printf("*** ipv4_parse_ctx_init() failed.\r\n");
27 return(1);
28 }
29
30 // print out each ip in range
31 while(1)
32 {
33 // get next ip in range
34 ret = ipv4_parse_next (&ctx, &addr);
35 if(ret < 0)
36 {
37 printf("*** end of range.\r\n");
38 break;
39 }
40
41 // print it out
42 printf("ADDR: %d.%d.%d.%d\r\n",
43 (addr >> 0) & 0xFF,
44 (addr >> 8) & 0xFF,
45 (addr >> 16) & 0xFF,
46 (addr >> 24) & 0xFF);
47 }
48
49 return(0);
50 }
文件main.c可以说是解析引擎的驱动文件。在第10行,main.c接收从标准输入中解析出来的IP范围。第16行到第20行详细描述将输出发送到标准输出的文件用法。第30行到第46行可以说是程序的高层核心,使用while循环调用ipv4_parse_next来获取输入的IP地址范围,并打印出结果。
1 /*
2 * ipv4_parse.h
3 *
4 */
5
6 #ifndef __IPV4_PARSE_H__
7 #define __IPV4_PARSE_H__
8
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12
13 typedef struct ipv4_parse_ctx
14 {
15 unsigned char m_state[4][256];
16 unsigned short m_index[4];
17
18 } ipv4_parse_ctx;
19
20 /*
21 * ipv4_parse_ctx_init()
22 *
23 *
24 */
25 int ipv4_parse_ctx_init (ipv4_parse_ctx *ctx ,
26 char *range );
27
28 /*
29 * ipv4_parse_next_addr()
30 *
31 *
32 */
33 int ipv4_parse_next (ipv4_parse_ctx *ctx ,
34 unsigned int *addr );
35
36 #ifdef __cplusplus
37 }
38 #endif
39
40 #endif /* __IPV4_PARSE_H__ */
41
文件ipv4_parse.h是一个C/C++头文件,它定义了文件ipv4_parse.c中的函数的原型,从而可以消除C编译器生成的警告。用C++编译器编译的时候,由于类型检测的需要,函数原型在使用之前必须进行声明。必须使用外部C命令来防止C++编译器对名称提出置疑。






