WinPcap学习(三)获取已安装设备的高级信息

原文: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库,即解决。

你可能感兴趣的:(WinPcap学习(三)获取已安装设备的高级信息)