#include<stdio.h>
#include<sys/socket.h>
#include<netdb.h>
#include<sys/types.h>
#include<strings.h>
void print_family(struct addrinfo *aip)
{
printf(" family ");
switch (aip->ai_family) {
case AF_INET:
printf("inet");
break;
case AF_INET6:
printf("inet6");
break;
case AF_UNIX:
printf("unix");
break;
case AF_UNSPEC:
printf("unspecified");
break;
default:
printf("unknown");
}
}
void print_type(struct addrinfo *aip)
{
printf(" type ");
switch (aip->ai_socktype) {
case SOCK_STREAM:
printf("stream");
break;
case SOCK_DGRAM:
printf("datagram");
break;
case SOCK_SEQPACKET:
printf("seqpacket");
break;
case SOCK_RAW:
printf("raw");
break;
default:
printf("unknown (%d)", aip->ai_socktype);
}
}
void print_protocol(struct addrinfo *aip)
{
printf(" protocol ");
switch (aip->ai_protocol) {
case 0:
printf("default");
break;
case IPPROTO_TCP:
printf("TCP");
break;
case IPPROTO_UDP:
printf("UDP");
break;
case IPPROTO_RAW:
printf("raw");
break;
default:
printf("unknown (%d)", aip->ai_protocol);
}
}
void print_flags(struct addrinfo *aip)
{
printf("flags");
if (aip->ai_flags == 0) {
printf(" 0");
} else {
if (aip->ai_flags & AI_PASSIVE)
printf(" passive");
if (aip->ai_flags & AI_CANONNAME)
printf(" canon");
if (aip->ai_flags & AI_NUMERICHOST)
printf(" numhost");
}
}
int main(int argc,char **argv){
struct addrinfo *ailist,*aip;
struct addrinfo hint;
struct sockaddr_in *sinp;
const char *addr;
int err;
//inet_addrstrlen用来存放足够长的ipv4的地址字符串如a.b.c.d点分十进制的ip地址
char abuf[INET_ADDRSTRLEN];
if(argc !=3 && argc !=2){
return -1;
}
//将结构体清零
bzero(&hint,sizeof(struct addrinfo));
hint.ai_flags=AI_CANONNAME;
//调用getaddrinfo得到信息
err=getaddrinfo(argv[1],(argc==2)?NULL:argv[2],&hint,&ailist);
if(err){
printf("getaddrinfo error: %s",gai_strerror(err));
return -1;
}
for(aip=ailist;aip!=NULL;aip=aip->ai_next){
print_flags(aip);
print_family(aip);
print_type(aip);
print_protocol(aip);
if(aip->ai_family==AF_INET){
sinp=(struct sockaddr_in *)aip->ai_addr;
addr=inet_ntop(AF_INET,&sinp->sin_addr,abuf,INET_ADDRSTRLEN);
printf("abuf: %s",abuf);
printf("address: %s",addr?addr:"UNKNOWN");
printf("port %d",ntohs(sinp->sin_port));
}
printf("\n");
}
return 0;
}
运行结果:
代码来自<<apue>>(有一点改动)