lvxuzhou


私信TA

用户名:lvxuzhou

访问量:97341

签 名:

lvxuzhou

等  级
排  名 48
经  验 11191
参赛次数 0
文章发表 56
年  龄 0
在职情况 学生
学  校 西安
专  业

  自我简介:

一、QT配置:
QQ图片20211026231104.png

二、测试代码:

#include "pcap.h"
#include <QCoreApplication>
#include <winsock2.h>
#include <ws2tcpip.h>

// 函数原型
void ifprint(pcap_if_t *d);
char *iptos(u_long in);
char *ip6tos(struct sockaddr *sockaddr, char *address, int addrlen);
int main(int argc, char *argv[]) {
  QCoreApplication a(argc, argv);
  pcap_if_t *alldevs;
  pcap_if_t *d;
  char errbuf[PCAP_ERRBUF_SIZE];
  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 /* auth is not needed */, &alldevs,
                          errbuf) == -1) {
    fprintf(stderr, "Error in pcap_findalldevs_ex: %s\n", errbuf);
    exit(1);
  }

  /* 打印列表 */
  for (d = alldevs; d != NULL; d = d->next) {
    ifprint(d);
  }

  /* 不再需要设备列表了,释放它 */
  pcap_freealldevs(alldevs);
  return a.exec();
}
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 12
char *iptos(u_long in) {
  static char output[IPTOSBUFFERS][3 * 4 + 3 + 1];
  static short which;
  u_char *p;

  p = (u_char *)&in;
  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 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;
}

1、函数介绍 

参考链接:https://www.cnblogs.com/dzqdzq/p/3287484.html

pcap是packet capture的缩写。意为抓包。

功能:查找所有网络设备

原型:int pcap_findalldevs_ex(char* source,  struct pcap_rmtauth *auth,  pcap_if_t** alldevs,   char* errbuf );

返回值:0表示查找成功。-1表示查找失败

参数说明:

source:

指定是本地适配器或者远程适配器

本地适配器:'rpcap://'

远程适配器:'rpcap://host:port'

抓包文件。'file://c:/myfolder/'.

Defined:

#define     PCAP_SRC_FILE_STRING   "file://"    

String that will be used to determine the type of source in use (file, remote/local interface).     

#define     PCAP_SRC_IF_STRING   "rpcap://"    

String that will be used to determine the type of source in use (file, remote/local interface).    

三、运行结果

QQ图片20211026231104.png

 

0.0分

0 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区