#include#else#include#endif由于是Win32平台的开发,#ifndefWIN32...#else那段都是没用的" />

WinPcap初学(2)

系统 1670 0

    还是按照“winpcap使用系列” http://www.smatrix.org/bbs/read.php?tid=359&fpage=4  一步步学习。先看文章里头包含的头文件。
#include  " pcap.h "
#ifndef WIN32
#include 
< sys / socket.h >
#include 
< netinet / in .h >
#else
#include 
< winsock.h >
#endif
    由于是Win32平台的开发,#ifndef WIN32...#else那段都是没用的。真正要使用到的是#include<winsock.h>。首先声名一下,我做出来的测试程序是MFC的窗口程序。而 MFC程序中的自动生成的stdaf x.h文件中有这么一句 #include < af xwi n.h // M FC 核心组件和标准组件,而在afxwin.h里头有就winsock2.h的声名。事实上winsock与winsock2是干同样活的,不过是新旧之分,所以假如你在程序中加上#include<winsock.h>的话就必然会出现函数同名的错误(winsock与winsock2很多同名的函数)。因此在我的程序中只须声名#include "pcap.h"。
    接着,看下代码。
Code

    这些使用到一些控制台程序的函数,不过对于MFC程序没有大碍。先不说ifprint和iptos的作用,我们来看来pcap_if_t这个结构。
    在pcap.h中它有一个另名pcap_if,至于为什么要改名字我也不太清楚。(为了说明这个一个type?)在官方的文档中(...\WpdPack\docs\html\structpcap__if.html)对pcap_if进行如下定义:
pcap_if next
  if not NULL, a pointer to the next element in the list; NULL for the last element of the list
char *  name
  a pointer to a string giving a name for the device to pass to pcap_open_live()
char *  description
  if not NULL, a pointer to a string giving a human-readable description of the device
pcap_addr addresses
  a pointer to the first element of a list of addresses for the interface
u_int  flags
  PCAP_IF_ interface flags. Currently the only possible flag is PCAP_IF_LOOPBACK , that is set if the interface is a loopback interface.

    next是对下一个设备驱动的指针,name是本驱动的名字(基本上是一些不知所云的数字),description是驱动的描述(如Realtek RTL8169/8110 Family Gigabit Ethernet NIC,这个程序员就比较清楚了),pcap_addr则是另一个pcap.h中定义的结构,最后的flags目前为0。 官方文档对pcap_addr定义如下:
pcap_addr next
  if not NULL, a pointer to the next element in the list; NULL for the last element of the list
sockaddr *  addr
  a pointer to a struct sockaddr containing an address
sockaddr *  netmask
  if not NULL, a pointer to a struct sockaddr that contains the netmask corresponding to the address pointed to by addr.
sockaddr *  broadaddr
  if not NULL, a pointer to a struct sockaddr that contains the broadcast address corre­ sponding to the address pointed to by addr; may be null if the interface doesn't support broadcasts
sockaddr *  dstaddr
  if not NULL, a pointer to a struct sockaddr that contains the destination address corre­ sponding to the address pointed to by addr; may be null if the interface isn't a point- to-point interface
    其中,addr为IP地址,netmask为子网掩码(以上两个都为平时常用的网络连接设置),broadaddr为广播地址(说明参照百度百科 http://baike.baidu.com/view/473043.htm#3 ),dstaddr为目标地址(具体使用不太清楚,什么叫点对点接口?什么情况下会有这个接口?哪位高人给我指点一下!)。以上4部分都是sockaddr这个结构,它的定义在ws2def.h中。
Code

    上面的0x0600是vista的版本号,就是说当系统为XP或以下的时候用u_short的定义(其实ADDRESS_FAMILY也就是个ushort,只是换个名字)。还是回来看下它的结构,主要是后面的sa_data[14],这个参考 http://baike.baidu.com/view/2355183.html ,里面说得很详细。下面是截图,可以很清楚地看到前2个字节都是0,接下来的4个是有值的,后面的都是0。
    实际上那4个有值的字节就是32位的地址,如192.168.0.1等。
    现在让我们回来看那两个函数ifprint及iptos。在看完pcap_if_t等结构的说明后,想必你也看出来ifprint就是对pcap_if_t结构的解析,iptos就是对sockaddr的解析了吧。
    目前为止还没有自己写的东西,谁叫我还是个新手,一步步学吧。下一步是做一个可以测试在1000M网卡下WinPcap发送能力的极限能到多少的小程序,以前100M的话好像只能到60M。

WinPcap初学(2)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论