getaddrinfo 函数的使用

#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>>(有一点改动)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值