WinPcap获取网卡的更多信息

来源:互联网 发布:来肯在线进销存软件 编辑:程序博客网 时间:2024/06/10 21:50

获取网卡的更多信息, IP地址, 子网掩码等等.

// pcap_findalldevs_ex2.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#define WINVER 0x0501#define HAVE_REMOTE#include <pcap.h>#include <ws2tcpip.h>#pragma comment(lib,"wpcap.lib")#pragma comment(lib,"ws2_32.lib")// 函数原型void ifprint(pcap_if_t *d);char *iptos(u_long in);char* ip6tos(struct sockaddr *sockaddr, char *address, int addrlen);int _tmain(int argc, _TCHAR* argv[]){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);getchar();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_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    12char *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;}


0 0
原创粉丝点击