#include"pcap.h"#pragmacomment(lib,"wpcap.lib")#pragmacomment(lib," />

日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

WinPcap初學(三)類的實現

系統 2181 0

??? 距離上次發博文有兩三個星期的時候了,期間看了一些書,如《Effective C++》、《Windows核心編程》。感覺對計算機有了一個新的認識,自己以前對程序的見解是那么膚淺,完全沒有操作系統的概念,也沒有程序各部分與內存關系的認識。下面開始介紹這個類。

1. 類成員介紹?

Code

??? 這個類包括了用于初始化網絡的InitPcap,用于返回網絡設備信息的DevMsg,用于選擇設備的SetDev,用于發送數據包的SendPacket和用于接收數據包的GetPacket。用戶必須先調用InitPcap,再調用SetDev,然后才能執行發送或接收。由于接收函數必采用回調方式才能工作,所以這里typedef了一個回調函數的指針void packet_handler(u_char *, const struct pcap_pkthdr *, const u_char *),它的三個參數都是pcap.h里頭的回調函數的參數。實際上,從WinPcap到用戶的使用共有兩次回調的過程,一是WinPcap提供的回調,另一個是封裝類的時候提供的回調。
2. 類的實現

Code

??? SendPacket中使用了關鍵段保證線程安全,這樣子在使用多線程的時候就不會因為網絡設備被同時調用而出錯。SendPacket的參數包括了一個UCHAR指針及待發送數據的長度,用戶使用時把待發送的數組的地址傳入參數一,把數組長度傳入參數二。GetPacket的參數包括一個函數指針及接收數據包的數目,這里的函數指針就是用戶需要被回調的函數的地址。用戶使用的時候把函數名(即函數指針)傳入參數一,把接收的數據包的個數傳入參數二,當有數據包被檢測到的時候回調函數就會被執行,當接收的數據包的數目超出cnt時,pcap_loop就會退出(在此之前pcap_loop是沒有退出的,它是一個循環并阻塞等待數據包的函數)。
??? 由于本人是從C#轉過來的(雖然開始學的是C++,后來由于種種原因開始使用起C#),對于event方式的回調比較熟悉。開始要寫C++的回調一直沒弄明白,查了一些中文的資料覺得都看得糊里糊涂的,后來看到外國的資料才明白了 http://www.newty.de/fpt/callback.html 。其實回調的關鍵就是把需要被回調的函數的地址作為參數傳入另一個函數,還有你必須給這個函數定義一個格式,如參數和返回值,這樣子回調的時候程序才能根據地址及參數列表從內存中調用被回調的函數。當然,定義函數格式的話可以通過typedef的形式在頭文件中定義,也可以在參數列表中直接定義,如void (*p) (...)這樣。
3.寫在后面
??? 發送函數只調用了比較簡單的pcap_sendpacket,而接收也是調用了pcap_loop。可能你也發現了發送還有pcap_sendqueue_queue,接收還有pcap_next_ex,不過對于簡單的任務使用前者就足夠了。

WinPcap初學(三)類的實現


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 浠水县| 内黄县| 抚松县| 台山市| 崇阳县| 元阳县| 阿拉善右旗| 友谊县| 肇源县| 余姚市| 邓州市| 靖安县| 南靖县| 西乌珠穆沁旗| 平利县| 高州市| 安图县| 虹口区| 定州市| 恩平市| 玉树县| 望城县| 偏关县| 高青县| 阳山县| 清河县| 抚州市| 卫辉市| 宜黄县| 肥西县| 崇左市| 靖边县| 宜兰县| 大同县| 新民市| 多伦县| 花莲市| 西城区| 安西县| 永康市| 逊克县|