热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WinPcap教程(2):获取设备高级信息

前篇:WinPcap教程(1):获取网卡列表WinPcap教程(1):获取网卡列表演示了如何获得网卡的基本信息(如设备名称和描述信息)。实

前篇:WinPcap教程(1):获取网卡列表

 

WinPcap教程(1):获取网卡列表演示了如何获得网卡的基本信息(如设备名称和描述信息)。实际上,WinPcap还可以提供更多其他高级信息。特别地,pcap_findalldevs_ex()返回的pcap_if结构包含了一个pcap_addr结构列表,包括:

-          网卡的地址列表

-          网络掩码列表(其中每项和地址列表中的一项对应)

-          广播地址列表(其中每项和地址列表中的一项对应)

-          目的地地址列表(其中每项和地址列表中的一项对应)

 

更进一步,pcap_findalldevs_ex()也可以返回远程网卡相关信息以及指定的本地目录中的pcap文件列表。

 

下面的示例代码提供了一个打印pcap_if结构完整内容的函数ifprint()。它被pcap_findalldevs_ex()所返回的每一项(译注:即pcap_if结构)调用。

/*

 * 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

 

#include "pcap.h"

 

#ifndef WIN32

    #include

    #include

#else

    #include

#endif

 

 

// Function prototypes

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';

 

  /* Retrieve the interfaces list */

  if (pcap_findalldevs_ex(source, NULL, &alldevs, errbuf) == -1)

  {

    fprintf(stderr,"Error in pcap_findalldevs: %s/n",errbuf);

    exit(1);

  }

 

  /* Scan the list printing every entry */

  for(d=alldevs;d;d=d->next)

  {

    ifprint(d);

  }

 

  pcap_freealldevs(alldevs);

 

  return 1;

}

 

 

 

/* Print all the available information on the given interface */

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");

}

 

 

 

/* From tcptraceroute, convert a numeric IP address to a string */

#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);

    _snprintf_s(output[which], sizeof(output[which]), sizeof(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 WIN32

    sockaddrlen = sizeof(struct sockaddr_in6);

    #else

    sockaddrlen = sizeof(struct sockaddr_storage);

    #endif

 

 

    if(getnameinfo(sockaddr,

        sockaddrlen,

        address,

        addrlen,

        NULL,

        0,

        NI_NUMERICHOST) != 0) address = NULL;

 

    return address;

}

 

后篇:WinPcap教程(3):打开网卡抓包


推荐阅读
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
author-avatar
我确实是一只猪_143_267
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有