//打印 pcap_if_t 信息
/* 将数字类型的IP地址转换成字符串类型的 */ #define IPTOSBUFFERS 12 char *iptos(u_long in) { static char output[IPTOSBUFFERS][3*4+3+1]; int nsize = sizeof(output); 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(struct sockaddr *sockaddr, char *address, int addrlen) { socklen_t sockaddrlen = 0; #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; }
bool ifprint(pcap_if_t *d) { pcap_addr_t *a; char ip6str[128]; // 设备名称 printf("\nadapter Name:%s\n",d->name); // 设备描述 if(d->description) printf("description:%s\n",d->description); // 回还地址 printf("lookback state:%s\n",(d->flags & PCAP_IF_LOOPBACK)? "yes" : "no"); // ip地址 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: if (a->addr) printf("Ip address:%s\n",iptos(((struct sockaddr_in *)(a->addr))->sin_addr.s_addr)); if(a->broadaddr) printf("broadcast address:%s\n",iptos(((struct sockaddr_in*)(a->broadaddr))->sin_addr.s_addr)); if(a->netmask) printf("netmask address:%s\n",iptos(((struct sockaddr_in*)(a->broadaddr))->sin_addr.s_addr)); if(a->dstaddr) printf("dstaddr 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("\t address:%s\n",ip6tos(a->addr,ip6str,sizeof(ip6str))); break; default: printf("\tAddress Family Name: Unknown\n"); break; } ; } return 0; }
iptos函数着实没有看明白那个宏的意思,有时间再慢慢研究。