程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 監聽以太網(3) Packet32數據結構說明

監聽以太網(3) Packet32數據結構說明

編輯:關於VC++

Packet32包中的數據結構:

第一個重要的數據結構:_ADAPTER(關於Network Adapter的)

typedef struct _ADAPTER
{
// 一個打開的NPF driver實例的句柄:
HANDLE hFile;
// 當前打開的網卡的名字:
CHAR SymbolicLink[MAX_LINK_NAME_LENGTH];
// 在這塊Adapter上,一個數據包被寫的次數:
int NumWrites;

// 這塊Adapter上的read操作的通知事件。它可以被傳遞給標准Win32函數(如WaitForSingleObject或者WaitForMultipleObjects),這樣可以等待到driver的緩沖區內有數據到來。在同時等待幾個事件的GUI程序中,它特別有用。在Windows2000/XP中,函數PacketSetMinToCopy()可以用來設置內核緩沖區中激發本事件的最小數據大小:

HANDLE ReadEvent;
// 設置一個時間,到時候,即使沒有捕獲任何包,read操作也會被釋放,ReadEvent也會被觸發:
UINT ReadTimeOut;
} ADAPTER, *LPADAPTER;

第二個重要的數據結構:_PACKET(關於Packet的)

typedef struct _PACKET
{
// 向後兼容用的:
HANDLE    hEvent;
// 向後兼容用的:
OVERLAPPED  OverLapped;
// 存放Packets的緩沖區:
PVOID    Buffer;
// 緩沖區的大小:
UINT     Length;
// 當前緩沖區中有效的字節數,如,上一次調用PacketReceivePacket()函數接收到的字節數:
DWORD    ulBytesReceived;
// 向後兼容用的:
BOOLEAN   bIoComplete
} PACKET, *LPPACKET;

第三個重要的數據結構:_PACKET_OID_DATA (關於OID請求的)

typedef struct _PACKET_OID_DATA
{
// OID的code,有效的OID code的定義參見ntddndis.h;比如:
// OID_GEN_SUPPORTED_LIST,OID_GEN_VENDOR_DESCRIPTION等:
ULONG Oid;
// 成員Data的長度:
ULONG Length;
// 存放發送給網卡或者從網卡接收的數據的緩沖區:
UCHAR Data[1];
}
typedef struct _PACKET_OID_DATA PACKET_OID_DATA, *PPACKET_OID_DATA;

其他數據結構:

npf_if_addr(網卡的地址):

typedef struct npf_if_addr {
struct sockaddr IPAddress; // IP address.
struct sockaddr SubnetMask; // Netmask for that address.
struct sockaddr Broadcast; // Broadcast address.
}npf_if_addr;
bpf_hdr(Packet Header):
struct bpf_hdr {
// 捕獲到的packet的timestamp:
struct timeval    bh_tstamp;
// 捕獲到的packet的長度:
UINT    bh_caplen;
// 原始packet的長度:
UINT    bh_datalen;
// bpf header的長度(this struct plus alignment padding):
USHORT       bh_hdrlen;
};

bpf_insn(一個簡單的BPF偽指令):

bpf_insn中包含了一個BPF注冊機的簡單指令,它被用來發送一個filter程序給driver。

struct bpf_insn {
// 指令的類型和尋址模式:
USHORT    code;
// Jump if true:
UCHAR jt;
// Jump if false:
UCHAR jf;
// 通用的一個字段,有多種目的:
int k;
};

bpf_program(一個BPF偽匯編程序):

這段程序將被PacketSetBPF()注射入內核,並被應用到每一個進來的Packet。

struct bpf_program {
// 程序指令數目,如,後面的bpf_insn結構的數目:
UINT bf_len;
// 指向第一個bpf_insn結構的指針:
struct bpf_insn *bf_insns;
};

bpf_stat (本次捕獲的統計數據):

這個結構將被Packet.dll用來返回捕獲過程中的統計數據。

struct bpf_stat {
// 從開始捕獲起,這個driver從網卡上接收的Packet的數量(包括driver丟失的Packet):
UINT bs_recv;
//從開始捕獲起,這個driver丟失的Packet的數量,一般地,包丟失,是因為driver的緩沖區滿了,這時driver將扔掉這個包:
UINT bs_drop;
UINT ps_ifdrop;
// 通過filter的包的數量:
UINT bs_capt;
};
dump_bpf_hdr(Dump Packet Header):
struct dump_bpf_hdr{
// Packet的timestamp:
struct timeval    ts;
// 捕獲到的packet的長度:
UINT           caplen;
// 原始Packet的長度:
UINT           len;
};

NetType (網絡類型):

NetType用於PacketGetNetType(),返回當前網卡的類型和速度。

struct NetType{
//當前網卡的MAC:
UINT LinkType;
// 網絡的速度(bits/s):
UINT LinkSpeed;
};

(To be continued)

Writen by [email protected]

本文檔所包含的信息代表了在發布之日,ZhengYun 對所討論問題的當前看法,Zhengyun 不保證所給信息在發布之日以後的准確性。

本文檔僅供參考。對本文檔中的信息,Zhengyun 不做任何明示或默示的保證。

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved