原文:http://www.ferrisxu.com/WinPcap/html/index.html
事实上,WinPcap提供了其他更高级的信息,特别需要指出的是,由pcap_findalldevs_ex()返回的每一个pcap_if结构体,都包含一个pcap_addr结构体,这个结构体由如下元素组成:
(1)一个地址列表
(2)一个掩码列表
(3)一个广播地址列表
(4)一个目的地址列表
/* * Copyright (c) 1999 - 2005 NetGroup, Politecnico di Torino (Italy) * Copyright (c) 2005 - 2006 CACE Technologies, Davis (California) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the Politecnico di Torino, CACE Technologies * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include <iostream> #include <pcap.h> #define _WIN32_WINNT 0x501 #include <ws2tcpip.h> void ifprint(pcap_if_t *d); char * iptos(u_long in); char * ip6tos(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]; std::cout<<"Enter the device you want to list:"<<std::endl; std::cout<<"rpcap:// ==>lists the interface in the local machine"<<std::endl; std::cout<<"rpcap://hostname:port ==>lists interfaces in a remote machine"<<std::endl; std::cout<<" (rpcapd daemon must be up and running"<<std::endl; std::cout<<" and it must accept 'null' authentication"<<std::endl; std::cout<<"file://foldername ==>lists all pcap files in the give folder\n"<<std::endl; fgets(source,PCAP_ERRBUF_SIZE,stdin); source[PCAP_ERRBUF_SIZE] = '\0'; if(pcap_findalldevs_ex(source,NULL,&alldevs,errbuf)==-1) { std::cerr<<"Error in pcap_findalldevs:"<<errbuf<<std::endl; exit(1); } for(d=alldevs;d;d=d->next) { ifprint(d); } pcap_freealldevs(alldevs); return 0; } void ifprint(pcap_if_t *d) { pcap_addr_t *a; char ip6str[128]; std::cout<<d->name<<std::endl; if(d->description) std::cout<<d->description<<std::endl; std::cout<<"\tLoopback:"<<((d->flags&PCAP_IF_LOOPBACK)?"yes":"no")<<std::endl; for(a=d->addresses;a;a=a->next){ std::cout<<"\tAddress Family:#"<<a->addr->sa_family<<std::endl; switch(a->addr->sa_family) { case AF_INET: std::cout<<"\tAddress Family Name:AF_INET"<<std::endl; if(a->addr) std::cout<<"\tAddress:"<<iptos(((sockaddr_in *)a->addr)->sin_addr.s_addr)<<std::endl; if(a->netmask) std::cout<<"\tNetmask:"<<iptos(((sockaddr_in*)a->netmask)->sin_addr.s_addr)<<std::endl; if(a->broadaddr) std::cout<<"\tBroadcast Address:"<<iptos(((sockaddr_in*)a->broadaddr)->sin_addr.s_addr)<<std::endl; if(a->dstaddr) std::cout<<"\tDestination Address:"<<iptos(((sockaddr_in*)a->dstaddr)->sin_addr.s_addr)<<std::endl; break; case AF_INET6: std::cout<<"\tAddress Family:AF_INET6"<<std::endl; if(a->addr) std::cout<<"\tAddress:"<<ip6tos(a->addr,ip6str,sizeof(ip6str))<<std::endl; break; default: std::cout<<"\tAddress Family Name:Unkown"<<std::endl; break; } } std::cout<<std::endl; } #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(sockaddr* sockaddr,char* address,int addrlen) { socklen_t sockaddrlen; sockaddrlen = sizeof(sockaddr_in6); if(getnameinfo(sockaddr, sockaddrlen, address, addrlen, NULL, 0, NI_NUMERICHOST)!=0) address = NULL; return address; }
在codeblocks中用mingw进行编译,添加libsw2_32.a库,即解决。