首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

文件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++编译器对名称提出置疑。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论