//打印 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函数着实没有看明白那个宏的意思,有时间再慢慢研究。