网络数据包检测--抓包一例

网络数据包检测--抓包一例
文章图片


代码:

1:/*

2:* =====================================================================================

3:*

4:*Filename:cap.c

5:*

6:*Description:

7:*

8:*Version:1.0

9:*Created:03/15/2013 11:23:38 AM

10:*Revision:none

11:*Compiler:gcc

12:*

13:*Author:YOUR NAME (),

14:*Company:

15:*

16:* =====================================================================================

17:*/

18:

19:

20:#include

21:

22:#include

23:#include

24:

25:#define N 256

26:

27:void handler(u_char *arg, const struct pcap_pkthdr *pkthdr, const u_char *packet)

28:{

29:int i = 0;

30:int *count = (int *)arg;

31:

32:printf("Packet Count: %d\n",++(*count));

33:

34:printf("Received package size :%d\n",pkthdr->len);

35:

36:

37:printf("Payload:\n");

38:

39:for(i = 0; ilen; i++)

40:{

41:printf("%02x ", (unsigned int)packet[i]);

42:

43:if((i%16 == 15 && i!=0) || (i == pkthdr->len - 1))

44:{

45:printf("\n");

46:}

47:

48:

49:

50:}

51:printf("\n\n****************************************\n");

52:return ;

53:}

54:int main(int argc, char *argv[])

55:{

56:char *device;

57:int count = 0;

58:char err_buffer[N];

59:bpf_u_int32 netp;

60:bpf_u_int32 maskp;

61:pcap_t *p;

62:struct bpf_program fp;

63:char str[40] = "host 192.168.1.173"; //过滤条件

64:

65:if(argc < 2)//获取或指定网络设备,如指定 "eth0"

66:{

67:device = pcap_lookupdev(err_buffer);

68:}

69:else

70:{

71:device = argv[1];

72:}

73:

74:printf("device : %s\n",device);

75:

76:if(pcap_lookupnet(device, &netp, &maskp, err_buffer) < 0)//获取设备的网络信息

77:{

78:printf("error! %s\n",err_buffer);

79:exit(-1);

80:}

81:

82:if((p = pcap_open_live(device, 2048, 1, 0, err_buffer)) == NULL) //打开网络设备device,返回用于捕获数据包的句柄

83:{

84:printf("error! %s\n",err_buffer);

85:exit(-1);

86:}

87:

88:if(pcap_compile(p, &fp, str, 1, maskp) < 0) //根据过滤条件生成过滤器

89:{

90:printf("fail to pcap_compile");

91:exit(-1);

92:}

93:

94:

95:if(pcap_setfilter(p, &fp) < 0)//安装生成的过滤器

96:{

97:printf("fail to pcap_next");

98:exit(-1);

99:}

100:

101:if(pcap_loop(p, 2, handler, (u_char *)&count) < 0)//循环捕获两帧数据

102:{

103:printf("fail to pcap_loop");

104:exit(-1);

105:}

106:

107:

108:return 0;

109:}

110:



运行:
网络数据包检测--抓包一例
文章图片

然后再windows下,或者再开一个窗口,ping 过滤条件中的ip地址。

网络数据包检测--抓包一例
文章图片


可以看到,已经捕获到两帧数据。
网络数据包检测--抓包一例
文章图片

【网络数据包检测--抓包一例】可以看到,捕获到的第一帧数据的目的MAC是ff ff ff ff ff ff ,即是一个广播数据包的目的MAC,源MAC地址是4c 72 b9 05 1e 90,它是我的windows下面的网卡的物理MAC地址。协议类型为 0806,是一个ARP协议包,用于地址解析,是数据链路层的协议。收到的第二帧数据是虚拟机回复的消息。



下面是通过抓包工具wireshark的抓包结果:
网络数据包检测--抓包一例
文章图片

    推荐阅读