WinPcap笔记(3):获取已安装设备的详细信息
現在已經知道了如何獲取本地設備的基本信息。事實上,WinPcap提供了其它更高級的信息。在函數pcap_findalldevs_ex()返回的pcap_if結構體中,都有一個pcap_addr的結構體,這個結構體用來保存地址信息。定義如下:
pcap_addr* next;//指向下一個節點 sockaddr* addr;//一個地址列表 sockaddr* netmask;//一個掩碼列表 sockaddr* broadaddr;//一個廣播地址列表 sockaddr* dstaddr;//一個目的地址列表其中,sockaddr結構用來存儲與Windows套接字通訊的計算機上的一個IP地址。定義如下:
unsigned short sa_family;//地址族 char sa_data[14];//IP地址sockaddr一共16字節,其中2字節存儲地址族(如AF_INET),14個字節用來存儲IP地址,用來作為bind、connect、recvfrom、sendto等函數的參數,指明地址信息一般不直接針對次數據結構操作。一個和sockaddr相似的結構是sockaddr_in結構體,可以相互轉換,也是16字節,定義如下:
unsigned short sin_family;//協議族,在socket編程中只能是AF_INET unsigned short int sin_port;//存儲端口號,使用網絡字節順序 struct in_addr sin_addr;//存儲IP地址,使用in_addr結構 unsigned char sin_zero[8];//為了讓sockaddr和sockaddr_in大小相同而保留的空字節in_addr結構用來存儲IP地址。在Linux中定義如下:
typedef uint32_t in_addr_t; struct in_addr {in_addr_t s_addr; };在Windows中定義如下:
typedef struct in_addr {union{struct { unsigned char s_b1,s_b2,s_b3,s_b4; } S_un_b;struct { unsigned short s_w1,s_w2; } S_un_w;unsigned long S_addr;}S_un; }in_addr;
在Windows中是一個共用體,有三種方式表示IP地址:
(1)S_un_b:用四個字節表示IP地址的四個數字;
(2)S_un_w:用兩個字節表示IP地址;
(3)S_addr:用一個長整形表示IP地址,例如192.168.3.144記為0xc0a80390,其中 c0 為192 ,a8 為 168, 03 為 3 , 90 為 144;
下面的代碼對pcap_findalldevs_ex()函數返回的alldevs逐個打印詳細信息:
#include "pcap.h"#ifndef WIN32 #include <sys/socket.h> #include <netinet/in.h> #else #include <winsock.h> #endif// 函數原型 void ifprint(pcap_if_t *d); char *iptos(u_long in); char* ip6tos(struct sockaddr *sockaddr, char *address, int addrlen);int main() {pcap_if_t *alldevs;pcap_if_t *d;char errbuf[PCAP_ERRBUF_SIZE + 1];char source[PCAP_ERRBUF_SIZE + 1];printf("Enter the device you want to list:\n""rpcap:// ==> lists interfaces in the local machine\n""rpcap://hostname:port ==> lists interfaces in a remote machine\n"" (rpcapd daemon must be up and running\n"" and it must accept 'null' authentication)\n""file://foldername ==> lists all pcap files in the give folder\n\n""Enter your choice: ");fgets(source, PCAP_ERRBUF_SIZE, stdin);source[PCAP_ERRBUF_SIZE] = '\0';/* 獲得接口列表 */if (pcap_findalldevs_ex(source, NULL, &alldevs, errbuf) == -1){fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);exit(1);}/* 掃描列表并打印每一項 */for (d = alldevs;d;d = d->next){ifprint(d);}pcap_freealldevs(alldevs);return 1; }/* 打印所有可用信息 */ void ifprint(pcap_if_t *d) {pcap_addr_t *a;char ip6str[128];/* 設備名(Name) */printf("%s\n", d->name);/* 設備描述(Description) */if (d->description)printf("\tDescription: %s\n", d->description);/* Loopback Address*/printf("\tLoopback: %s\n", (d->flags & PCAP_IF_LOOPBACK) ? "yes" : "no");/* IP addresses */for (a = d->addresses;a;a = a->next) {printf("\tAddress Family: #%d\n", a->addr->sa_family);switch (a->addr->sa_family){case AF_INET:printf("\tAddress Family Name: AF_INET\n");if (a->addr)printf("\tAddress: %s\n", iptos(((struct sockaddr_in *)a->addr)->sin_addr.S_un.S_addr));if (a->netmask)printf("\tNetmask: %s\n", iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr));if (a->broadaddr)printf("\tBroadcast Address: %s\n", iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr));if (a->dstaddr)printf("\tDestination Address: %s\n", iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr));break;case AF_INET6:printf("\tAddress Family Name: AF_INET6\n");if (a->addr)printf("\tAddress: %s\n", ip6tos(a->addr, ip6str, sizeof(ip6str)));break;default:printf("\tAddress Family Name: Unknown\n");break;}}printf("\n"); }/* 將數字類型的IP地址轉換成字符串類型的 */ #define IPTOSBUFFERS 12 char *iptos(u_long in) {static char output[IPTOSBUFFERS][3 * 4 + 3 + 1];static short which;u_char *p;p = (u_char *)∈which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);sprintf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);return output[which]; }char* ip6tos(struct sockaddr *sockaddr, char *address, int addrlen) {socklen_t sockaddrlen;#ifdef WIN32sockaddrlen = sizeof(struct sockaddr_in6); #elsesockaddrlen = sizeof(struct sockaddr_storage); #endifif (getnameinfo(sockaddr,sockaddrlen,address,addrlen,NULL,0,NI_NUMERICHOST) != 0) address = NULL;return address; }結果如下:
總結
以上是生活随笔為你收集整理的WinPcap笔记(3):获取已安装设备的详细信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 该怎样去预防卵巢早衰
- 下一篇: WinPcap笔记(4):打开适配器并捕