監聽乙太網(四) Packet32函式SDK (轉)
乙太網(四) Packet32SDK
Article last modified on 2002-9-18
The information in this article applies to::namespace prefix = o ns = "urn:schemas--com::office" />
ü Microsoft WindwNTx
ü Microsoft Windwos 9x
ü WinPcap: the Free Packet Capture Architecture for
Packet32包中的函式說明:
名>No.3. PacketSetHwFilter (設定過濾器)
設定一個hardware filter。比如,Filter引數傳遞NDIS_PACKET_TYPE_PROMISCUOUS,就可以設定網路卡為混雜。
BOOLEAN PacketSetHwFilter(
LPADAPTER Adapter,
ULONG Filter
);
Parameters:
AdapterObject:
[in] 指向一個_ADAPTER結構的指標。
Filter:
[in] 過濾器的id。
Return Values:
如果成功,返回一個非零值。
Usage:
C/C++ Usage Sample
lpAdapter = PacketOpenAdapter(AdapterList[Open-1]);
PacketSetHwFilter(lpAdapter,NDIS_PACKET_TYPE_PROMISCUOUS);
Remarks:
過濾器定義在ntddndis.h中。下面是一些最常用的:
NDIS_PACKET_TYPE_PROMISCUOUS:設定混雜模式。網路卡接收每一個Packet;
NDIS_PACKET_TYPE_DIRECTED;
NDIS_PACKET_TYPE_BROADCAST:只接收broadcast packets;
NDIS_PACKET_TYPE_MULTICAST:只接收multicast packets,而且本機網路卡是接收組的一個成員;
NDIS_PACKET_TYPE_ALL_MULTICAST:所有multicast packets都接收;
NDIS_PACKET_TYPE_ALL_LOCAL:所有local packets。
這個函式的實現是非常簡單的:
首先填充PACKET_OID_DATA結構的Oid成員為OID_GEN_CURRENT_PACKET_FILTER,填充Data成員為既定的Filter,PacketRequest向網路卡傳送OID請求即可。
No.4. PacketSetBuff (設定緩衝區的大小)
設定捕獲的核心級緩衝區的大小。
BOOLEAN PacketSetBuff(
LPADAPTER AdapterObject,
int dim
);
Parameters:
AdapterObject:
[in] 指向一個_ADAPTER結構的指標。
dim:
[in] 緩衝區的大小(單位:位元組)。
Return Values:
如果執行成功,返回一個TRUE。如果沒有足夠的分配,返回FALSE。
Usage:
C/C++ Usage Sample
lpAdapter = PacketOpenAdapter(AdapterList[Open-1]);
PacketSetBuff(lpAdapter,512000) ; // 設定有512KB位元組的緩衝區
Remarks:
一旦設定了一個新緩衝區大小,在原來的那塊緩衝區中的資料就會被丟棄,包括存在裡面的Packets。
注意:核心緩衝區的大小會嚴重影響到捕獲程式的。一個適當的緩衝區可以在應用忙時保有資料,從而補償應用的響應延遲,並在活動頻繁時做到不丟失Packets。當driver的一個例項被開啟時,這個緩衝區的大小被重設為0:開發者應該記得把它設為一個合適的值,比如設為1MB。
本函式呼叫了DeviceIoControl,給AdapterObject引數的hFile成員指向的NPF driver裝置傳送pBIOCSETBUFFERSIZE控制碼。pBIOCSETBUFFERSIZE是在Packet32.h中定義的:
//< IOCTL code: set kernel buffer size:
#define pBIOCSETBUFFERSIZE 9592
No.5. PacketSetReadTimeout (設定讀操作的超時時間)
設定一次讀操作返回的超時時間。
BOOLEAN PacketSetReadTimeout(
LPADAPTER AdapterObject,
int timeout
);
Parameters:
AdapterObject:
[in] 指向一個_ADAPTER結構的指標。
timeout:
[in] 超時時間(單位:毫秒)。
Return Values:
如果執行成功,返回非零值。
Usage:
C/C++ Usage Sample
lpAdapter = PacketOpenAdapter(AdapterList[Open-1]);
PacketSetReadTimeout(lpAdapter,1000) ; // 設定讀操作超時時間1秒
Remarks:
在AdapterObject指向的網路卡上呼叫PacketReceivePacket(),到了設定的超時時間,這次呼叫就會釋放,即使沒有Packet被捕獲到。
設定超時時間為0,說明沒有超時。這樣,如果沒有Packet到來的話,PacketReceivePacket()方法永不會返回。
設定超時時間為-1,PacketReceivePacket()會立即返回。
這個函式也工作在網路卡的統計模式下。所以可以用來設定兩次統計報告之間的時間間隔。
這個函式也是透過DeviceIoControl傳送控制碼來實現的。
No.6. PacketAllocatePacket
為_PACKET結構分配記憶體。
LPPACKET PacketAllocatePacket(void);
Parameters:
無
Return Values:
如果執行成功,返回指向_PACKET結構的指標。否則,返回NULL。
Usage:
C/C++ Usage Sample
LPPACKET lpPacket;
lpPacket = PacketAllocatePacket() ;
Remarks:
這個函式並不負責為_PACKET結構的Buffer成員分配空間。這塊緩衝區必須由應用分配,而且必須呼叫PacketInitPacket來將這緩衝區和_PACKET結構關聯到一起。
No.7. PacketInitPacket
初始化一個_PACKET結構,即將packet結構中的buffer設定為傳遞的buffer指標。
VOID PacketInitPacket(
LPPACKET lpPacket,
PVOID Buffer,
UINT Length
);
Parameters:
lpPacket
[in] 指向一個_PACKET結構的指標。
Buffer
[in] 一個指向一塊分配的緩衝區的指標。捕獲的資料將放置於此。
Length
[in] 緩衝區的大小。這是一個讀操作從driver傳遞到應用的最大資料量。
Return Values:
無。
Usage:
C/C++ Usage Sample
char buffer[256000];
LPPACKET lpPacket;
PacketInitPacket(lpPacket,(char*)buffer,256000);;
Remarks:
Driver能夠用一個讀操作返回幾個Packets,那麼一次呼叫傳遞給應用程式的packet的數量,就只取決於傳遞給PacketReceivePacket()的_PACKET結構的buffer的大小了。因此用PacketInitPacket()初始化一塊大緩衝區,能夠顯著地減少呼叫,減少捕獲程式在上的影響。
No.8. PacketReceivePacket (讀取資料)
從NPF driver上讀取資料(Packets或者統計資訊)。
BOOLEAN PacketReceivePacket(
LPADAPTER AdapterObject,
LPPACKET lpPacket,
BOOLEAN Sync
);
Parameters:
AdapterObject:
[in] 指向一個_ADAPTER結構的指標。
lpPacket:
[in , out] 放資料的_PACKET結構緩衝區。
Sync:
[in] 一個可以忽略的引數,保留它是為了向後相容。
Return Values:
如果執行成功,返回一個非零值。
Usage:
C/C++ Usage Sample
LPADAPTER lpAdapter = 0;
LPPACKET lpPacket;
lpAdapter = PacketOpenAdapter(AdapterList[Open-1]);
lpPacket = PacketAllocatePacket();
PacketInitPacket(lpPacket,(char*)buffer,256000);
PacketReceivePacket(lpAdapter,lpPacket,TRUE);
Remarks:
這個函式所接收的資料可以是一組Packets,也可以是網路流量的一個統計資料,依賴於網路卡的工作模式。
接收到的Packet的數量是可變的。它依賴於幾個因素:當前在driver緩衝區中的Packet的數目,這些Packet的大小,分配給lpPacket引數的緩衝區的大小。
Packet儲存在lpPacket結構的buffer緩衝區內,lpPacket->Length指示著複製到緩衝區的資料的大小。
它的實現也很簡單:
先看看AdapterObject->ReadTimeOut是否是-1:
如果不是-1,則呼叫WaitForSingleObject等候AdapterObject->ReadEvent讀事件觸發,超時時間為AdapterObject->ReadTimeOut的數值。如果AdapterObject->ReadTimeOut為0,則永不超時。
如果是-1,就表明讀完立即返回。
之後,呼叫ReadFile讀取資料。
No.9. PacketGetStats (得到本次捕獲的統計資料)
得到當前捕獲程式的統計資訊。
BOOLEAN PacketGetStats(
LPADAPTER AdapterObject,
struct bpf_stat *s
);
Parameters:
AdapterObject:
[in] 指向一個_ADAPTER結構的指標。
s:
[in, out] bpf_stat結構,透過它,我們可以知道接收到的包數,丟失的包數等。
Return Values:
如果執行成功,返回非零值。
Usage:
C/C++ Usage Sample
struct bpf_stat stat;
PacketGetStats(lpAdapter,&stat) ;
Remarks:
透過這個函式,我們可以知道:
從開始捕獲起,這個driver從網路卡上接收的Packet的數量(包括driver丟失的Packet);
從開始捕獲起,這個driver丟失的Packet的數量,一般地,包丟失,是因為driver的緩衝區滿了,這時driver將扔掉這個包。
具體實現也是呼叫DeviceIoControl函式向裝置傳送pBIOCGSTATS控制碼,得到一個bpf_stat結構,然後只把這個結構的bs_recv和bs_drop成員返回。
No.10. PacketCloseAdapter
關閉網路卡。
VOID PacketCloseAdapter(LPADAPTER lpAdapter);
Parameters:
lpAdapter:
[in] 指向一個_ADAPTER結構的指標。
Remarks:
依次做下面的動作:
關閉lpAdapter->hFile,開啟的NPF driver的例項控制程式碼;
觸發lpAdapter->ReadEvent,並關閉這個控制程式碼;
解鎖並釋放lpAdapter。
(To be continued)
Writen by to:zhengyun@tomosoft.com">zhengyun@tomosoft.com
本文件所包含的資訊代表了在釋出之日,ZhengYun 對所討論問題的當前看法,Zhengyun 不保證所給資訊在釋出之日以後的準確性。
本文件僅供參考。對本文件中的資訊,Zhengyun 不做任何明示或默示的保證。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991825/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 監聽乙太網(三) Packet32資料結構說明 (轉)資料結構
- 乙太網分析儀
- 乙太網基礎
- 乙太網網路分析儀
- 乙太網分析儀品牌
- 實驗十三——————乙太網埠聚合
- VEPA虛擬乙太網埠聚合
- 網路基礎 : 乙太網資料封裝封裝
- 顯示乙太網Mac地址的方法Mac
- 客製化NVRAM的乙太網地址VR
- 什麼是乙太網?—Vecloud微雲Cloud
- FPGA乙太網學習-RGMII與GMIIFPGA
- 【乙太網】BCM84885B0KFEBG、BCM84885B0IFEBG雙埠乙太網收發器
- 千兆乙太網交換機的SFP埠有什麼優點(轉)
- 乙太網交換機效能比較對照指標詳解(轉)指標
- select監聽多個client -- linux函式clientLinux函式
- 編寫一個通用的事件監聽函式事件函式
- 乙太網交換機埠型別有哪些?型別
- 手持網路效能乙太網測試怎麼選?
- 單對乙太網(SPE)和工業物聯網
- 車載乙太網交換機入門基本功(3)—VLAN 轉發
- WIZnet嵌入式乙太網技術培訓公開課(免費!!!)
- 車載乙太網開發諮詢服務
- 一文串聯 HTTP、TCP、IP、乙太網HTTPTCP
- mac 關閉ipv6 連線乙太網Mac
- 乙太網:FPGA輸出delay(A7實現)FPGA
- win10移動熱點未建立乙太網怎麼辦_win10移動熱點如何建立乙太網Win10
- AG5300[乙太網供電 Plus 模組]、AG5800[乙太網供電PoE PD 模組] 中文資料
- win10系統乙太網圖示消失怎麼辦 win10電腦找回乙太網圖示的方法Win10
- Linux作業系統下乙太網卡的安裝及配置(轉)Linux作業系統
- win10 乙太網屬性 空白怎麼解決_win10乙太網屬性開啟是空白怎麼辦Win10
- win10為什麼沒有wifi只有乙太網 Win10沒有Wifi只有乙太網的解決辦法Win10WiFi
- 乙太網狀態檢視工具:Ethernet Status for MacMac
- Win10乙太網屬性空白怎麼辦Win10
- 乙太網MAC層處理CRC的兩種方法Mac
- 區域網中VPN乙太網接入技術的詳解
- 樹莓派連線Windows10 PC乙太網線上網樹莓派Windows
- win10乙太網無internet怎麼處理 win10電腦乙太網無internet的解決步驟Win10