问题:
hostent是gethostbyname()和gethostbyaddr()都会涉及到的一个结构体。代码如下:
struct hostent {
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
};
gethostbyname()的原型是:
struct hostent *gethostbyname(const char *name);
函数的传入值是域名或者主机名,例如"www.google.com"、"191.168.1.253"等;
函数的返回值:
成功时,返回一个指向hostent结构的指针;
失败时,返回NULL。
编程调试过程中需要查看所取到的IP地址等信息,所以将hostent的全部内容打印出来就对调试很有帮助了。
解决办法:
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/socket.h>
int main(int argc, char *argv[])
{
char *ptr,**pptr;
struct hostent *host;
char str[32];
char *hostname;
if (argc < 2) {
fprintf(stderr, "USAGE: ./pri-hostent Hostname(of ip addr such as 192.168.1.101)\n");
exit(1);
}
/* get the host name */
hostname = argv[1];
// if ((host = (struct hostent*)gethostbyname(argv[1])) == NULL) {
if ((host = (struct hostent*)gethostbyname(hostname)) == NULL) {
perror("gethostbyname");
return(1);
}
printf("Host name is: %s\n", host->h_name);
/* printf all the aliases of host */
for(pptr = host->h_aliases; *pptr != NULL; pptr++) {
printf(" alias of host: %s\n",*pptr);
}
printf("Host addrtype is: %d\n", host->h_addrtype);
printf("Host length is: %d\n", host->h_length);
// // printf("Host is: %x\n", *((struct in_addr*)host->h_addr));
/* printf ip address according to addrtype */
switch(host->h_addrtype) {
case AF_INET:
case AF_INET6:
pptr = host->h_addr_list;
/* print all the aliases,inet_ntop() is called */
for(; *pptr!=NULL; pptr++) {
inet_ntop(host->h_addrtype, *pptr, str, sizeof(str));
printf(" address: %s\n", str);
}
break;
default:
printf("unknown address type\n");
break;
}
return 0;
}
程序的运行结果:
dingq@wd-u1110:~/hwsvn/2sw/1prj_linux/pdu/src/branches/pdu-isocket/isocket$ ./pri-hostent
USAGE: ./pri-hostent Hostname(of ip addr such as 192.168.1.101)
dingq@wd-u1110:~/hwsvn/2sw/1prj_linux/pdu/src/branches/pdu-isocket/isocket$ ./pri-hostent www.google.com
Host name is: www.l.google.com
alias of host: www.google.com
Host addrtype is: 2
Host length is: 4
address: 74.125.128.106
address: 74.125.128.147
address: 74.125.128.99
address: 74.125.128.103
address: 74.125.128.104
address: 74.125.128.105