【VS开发】使用WinPcap编程(1)——获取网络设备信息
?
????? pcap_if_t是一個interface數據結構,表明網絡接口的信息。網絡接口就是interface,就是我們用來上網的設備,一般為網卡,還有一些虛擬網卡也算作這樣的接口。它的結構如下:
struct pcap_if {struct pcap_if *next; char *name; char *description; struct pcap_addr *addresses; u_int flags; };typedef struct pcap_if pcap_if_t;????? 其中的struct pcap_addr為:
struct pcap_addr {struct pcap_addr *next; struct sockaddr *addr; struct sockaddr *netmask; struct sockaddr *broadaddr; struct sockaddr *dstaddr; };
????? 當我們要獲網絡接口的時候,這個數據結構是非常重要的。
????? 這里只說Local host的設備的獲取,對于遠程設備,雖然有方法可以獲取,不過我試了試,總是出錯。
?
????? 首先使用pcap_createsrcstr()函數來初始化一個source,指明我們在哪里查找設備,可以是本地機器,可以是遠程機器,可以是本地文件夾(這樣找的就是存儲好的tcpdump的數據文件)。其函數原型如下:
int pcap_createsrcstr (char *source, int type, const char *host, const char *port, const char *name, char *errbuf)?
????? 1、source就是我們要存儲的位置信息。
????? 2、type有本地文件、本地機器、遠程機器可供選擇,分別為:PCAP_SRC_FILE,?PCAP_SRC_IFLOCAL,?PCAP_SRC_IFREMOTE
????? 3、host是遠程機器的名字,可以是"1.2.3.4”這樣,也可以是"a.com”這樣。本地為NULL。
????? 4、port為遠程端口。本地為NULL。
????? 5、name為接口的名字。比如eth0。一般為NULL。如果是本地文件就是本地文件夾地址。
????? 6、errbuf存儲錯誤信息。
????? 然后使用函數pcap_findalldevs_ex()這個函數來獲取網絡設備,其原型如下:
int pcap_findalldevs_ex (char * source,struct pcap_rmtauth * auth,pcap_if_t ** alldevs,char * errbuf )
????? 1、source可以使用上面設置好的source,也可以使用:PCAP_SRC_FILE_STRING?或者?PCAP_SRC_IF_STRING,分別是文件和接口的字符串。"file://", "rpcap://"。
????? 2、auth是遠程登錄信息,有用戶名、密碼、類型。用戶名和密碼都是字符指針,類型有:RPCAP_RMTAUTH_NULL?和?RPCAP_RMTAUTH_PWD。參看這里。
????? 3、alldevs用于存儲返回的接口信息。我們要事先定義pcap_if_t *alldevs,這是一個鏈表,存儲接口信息。
????? 4、errbuf出錯信息。
?
????? 這樣所獲得的alldevs就是一個接口的鏈表,如果是文件就是一個文件的鏈表。我們就可以用指針對這些鏈表進行操作了。
????? 最后不用這些設備的時候要把他們釋放掉,使用函數pcap_freealldevs(),其原型如下:
void pcap_freealldevs (pcap_if_t *alldevsp)?
????? 附上一個源代碼:
#include "pcap.h"int main() {pcap_if_t *alldevs; // pcap_if_t is interface typepcap_if_t *d;char errbuf[PCAP_ERRBUF_SIZE]; // store error informationint i;// struct pcap_rmtauth Ubuntu_cat;char source[PCAP_BUF_SIZE];if (pcap_createsrcstr(source, PCAP_SRC_FILE,NULL, NULL,"E:\\My Documents\\MyProgram\\WinPcapPro\\Read one packet\\Read one packet",errbuf) == -1) {printf("Error in create source string: %s\n", errbuf);exit(-1);}printf("%s\n", source);if(pcap_findalldevs_ex(source, // can be PCAP_SRC_IF_STRING for local hostNULL, // auth to remote host. NULL if local host&alldevs,errbuf) == -1) {printf("Error in find all devices: %s\n", errbuf);exit(1);}d = alldevs;while(d != NULL) {printf("%s\n%s\nAddress: ", d->name, d->description);for (i = 0; d->addresses != NULL && i < 14; i++)printf("%d ", d->addresses->addr->sa_data[i]);printf("\n\n");d = d->next;}pcap_freealldevs(alldevs);return 0; }轉載于:https://www.cnblogs.com/huty/p/8518339.html
總結
以上是生活随笔為你收集整理的【VS开发】使用WinPcap编程(1)——获取网络设备信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#里Attribute属性
- 下一篇: hadoop安装与配置