原文: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;
}
问题解决:getnameinfo was not declared in this scope
在codeblocks中用mingw进行编译,添加libsw2_32.a库,即解决。
最后欢迎大家访问我的个人网站: 1024s