1、程序
下图给出一个简单的程序,称为HOSTINFO,使用getaddrinfo和getnameinfo展示出域名到它关联的IP地址之间的映射。相当于nslookup指令。
#include"csapp.h"
int main(int argc,char **argv)
{
struct addrinfo *p,*listp,hints;
char buf[MAXLINE];
int rc,flags;
if(argc!=2){
fprintf(stderr,"usage :%s <domain>\n",argv[0]);
exit(0);
}
memset(&hints,0,sizeof(struct addrinfo));
hints.ai_family=AF_INET;
hints.ai_socktype=SOCK_STREAM;
if((rc=getaddrinfo(argv[1],NULL,&hints,&listp))!=0){
fprintf(stderr,"getaddrinfo error :%s\n",gai_strerror(rc));
exit(1);
}
flags=NI_NUMERICHOST;
for(p=listp;p;p=p->ai_next){
getnameinfo(p->ai_addr,p->ai_addrlen,buf,MAXLINE,NULL,0,flags);
printf("%s\n",buf);
}
freeaddrinfo(listp);
exit(0);
}
首先初始化hints结构,使getaddrinfo返回我们想要的地址,这里我们只需要查找32位的IP地址,用作连接的端点。所以service参数用NULL。调用getaddrinfo之后,会遍历addrinfo结构,用getnameinfo将每个套接字地址抓拿混为点分十进制字符串,遍历完列表后,调用freeaddrinfo释放这个列表。
2、头文件内容:
/* $begin csapp.h */
#ifndef __CSAPP_H__
#define __CSAPP_H__
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include <setjmp.h>
#include <