c++ winpcap开发(2)
生活随笔
收集整理的這篇文章主要介紹了
c++ winpcap开发(2)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
獲取有關可用適配器的基本信息(即設備名稱和描述)。實際上WinPcap還提供其他高級信息。特別地,pcap_findalldevs_ex()返回的每個pcap_if結構還包含pcap_addr結構的列表,其中包含:
- 該接口的地址列表。
- 網絡掩碼列表(每個都對應于地址列表中的一個條目)。
- 廣播地址的列表(每個地址對應于地址列表中的條目)。
- 目的地址列表(每個目的地址對應于地址列表中的條目)。
此外,pcap_findalldevs_ex()還可以返回遠程適配器和位于給定本地文件夾中的pcap文件列表。
以下示例提供了一個打印pcap_if結構的完整內容的ifprint()函數。該程序由pcap_findalldevs_ex()返回的每個條目調用。
#include <stdio.h>#include "pcap.h"#ifndef WIN32#include <sys/socket.h>#include <netinet/in.h> #else#include <winsock.h> #endif// 函數原型 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';/* 檢索接口列表 */if (pcap_findalldevs_ex(source, NULL, &alldevs, errbuf) == -1){fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf);exit(1);}/* 掃描列表打印每個條目 */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"); }/* 從tcptraceroute中,將數字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 *)∈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 WIN32sockaddrlen = sizeof(struct sockaddr_in6);#elsesockaddrlen = sizeof(struct sockaddr_storage);#endifif(getnameinfo(sockaddr, sockaddrlen, address, addrlen, NULL, 0, NI_NUMERICHOST) != 0) address = NULL;return address; }總結
以上是生活随笔為你收集整理的c++ winpcap开发(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lucene 索引优化
- 下一篇: bootstrap-datetimepi