posts - 3,  comments - 0,  trackbacks - 0

// 网络接口列表
struct pcap_if {
 struct pcap_if *next;  // 从这里可以看出是接口链表。这是标准C的写法。如果使用C++,可以只定义item,之后放到STL的list中就可以了。这种写法的效率应该更高些。但是使用标准C的库就够了,不需要C++库的支持,也不需要STL的支持,可以适应大部分的系统和硬件。使用了最少的语言特性,Simple and reliable,除非对开发效率和移植能力有要求,有时候C比C++更好些。
 char *name;  // 仅仅使用一个指针,而不是一个结构,这种做法不错的。 不是像C++放一个string,Java放一个String,虽然麻烦些,但是小巧、紧凑
 char *description; 
 struct pcap_addr *addresses;
 bpf_u_int32 flags; /* PCAP_IF_ interface flags */
};

// 接口地址
struct pcap_addr {
 struct pcap_addr *next;   // 在winpcap中好像没有用到列表功能。但是这么设计,当需要用到地址列表功能时就比较方便。
 struct sockaddr *addr;     // sockaddr结构可以存放各种类型的地址。从下面可以看出。 地址、网络掩码、广播地址和P2P地址
 struct sockaddr *netmask;
 struct sockaddr *broadaddr; 
 struct sockaddr *dstaddr; 
};

// 内核使用该结构来保存大部分的地址。以下定义是在windows系统头文件winsock2.h中找到的,在Linux中应该也定义了同样名称的结构吧
struct sockaddr {
        u_short sa_family;              // 地址类型
        char    sa_data[14];            // 14字节的地址,这里为什么没有用 char*了?
};

typedef struct pcap pcap_t;
// 原来这是一个挺复杂的结构
struct pcap {
#ifdef WIN32
     ADAPTER *adapter;
     LPPACKET Packet;
    int timeout;
    int nonblock;
#else
    int fd;
    int selectable_fd;
    int send_fd;
#endif /* WIN32 */
    int snapshot;
    int linktype;
    int tzoff;  /* timezone offset */
    int offset;  /* offset for proper alignment */

    int break_loop;  /* flag set to force break from packet-reading loop */

#ifdef PCAP_FDDIPAD
   int fddipad;
#endif

#ifdef MSDOS
        int inter_packet_wait;   /* offline: wait between packets */
        void (*wait_proc)(void); /*          call proc while waiting */
#endif

 struct pcap_sf sf;
 struct pcap_md md;

// 读缓存
     int bufsize;
     u_char *buffer;
     u_char *bp;
     int cc;

 /*
  * Place holder for pcap_next().
  */
     u_char *pkt;

 // 只接受来自这个方向的包。如何做到, INOUT是怎么回事?一个端口的通信都是单向的? Socket端口通信? 和串口有什么关系,或者相似之处?/串口也可以理解为一个端口,也可以分配一个端口号啊。。。
 pcap_direction_t direction;

// 定义了一堆的函数指针,都可以模拟OO机制了,呵呵
// 不过是一种极简化的操作,在Linux内核代码中可以看到很多这样的代码
 int (*read_op)(pcap_t *, int cnt, pcap_handler, u_char *);
 int (*inject_op)(pcap_t *, const void *, size_t);
 int (*setfilter_op)(pcap_t *, struct bpf_program *);
 int (*setdirection_op)(pcap_t *, pcap_direction_t);
 int (*set_datalink_op)(pcap_t *, int);
 int (*getnonblock_op)(pcap_t *, char *);
 int (*setnonblock_op)(pcap_t *, int, char *);
 int (*stats_op)(pcap_t *, struct pcap_stat *);
 void (*close_op)(pcap_t *);

 /*
  * Placeholder for filter code if bpf not in kernel.
  */
 struct bpf_program fcode;

     char errbuf[PCAP_ERRBUF_SIZE + 1];
     int dlt_count;
     u_int *dlt_list;

 struct pcap_pkthdr pcap_header; /* This is needed for the pcap_next_ex() to work */

    #ifdef HAVE_REMOTE
   #ifndef WIN32 // Win32 already defines 'timeout'
     int timeout;    //!< timeout to be used in the pcap_open()
    #endif
 /*! \brief '1' if we're the network client; needed by several functions (like pcap_setfilter() ) to know if
  they have to use the socket or they have to open the local adapter. */
     int rmt_clientside;

     SOCKET rmt_sockctrl;  //!< socket ID of the socket used for the control connection
     SOCKET rmt_sockdata;  //!< socket ID of the socket used for the data connection
     int rmt_flags;    //!< we have to save flags, since they are passed by the pcap_open_live(), but they are used by the pcap_startcapture()
     int rmt_capstarted;   //!< 'true' if the capture is already started (needed to knoe if we have to call the pcap_startcapture()
     struct pcap_samp rmt_samp; //!< Keeps the parameters related to the sampling process.
     char *currentfilter;  //!< Pointer to a buffer (allocated at run-time) that stores the current filter. Needed when flag PCAP_OPENFLAG_NOCAPTURE_RPCAP is    turned on.
#endif /* HAVE_REMOTE */
};

// 通信方向的枚举结构
typedef enum {
       PCAP_D_INOUT = 0, // 这个定义为0,下面的怎么不给个值?
       PCAP_D_IN,
       PCAP_D_OUT
} pcap_direction_t;

// 数据包头
struct pcap_pkthdr {
    struct timeval ts; /* time stamp */
    bpf_u_int32 caplen; // 展现的长度?
    bpf_u_int32 len; // 包的长度,bpf_u其实就是unsigned int,     类型定义还经过了一个中间层,即u_int,这样以后修改数据类型会比较方便
};

一层层代码看下来,还是比较繁琐的

posted on 2009-09-21 21:03 thinke365 阅读(533) 评论(0)  编辑 收藏 引用 所属分类: Winpcap

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理