0
/* As usual, make the appropriate includes and declare the variables. */
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char *host, **names, **addrs;
struct hostent *hostinfo;
/* Set the host in question to the argument supplied with the getname call,
or default to the user's machine. */
if(argc == 1) {
char myname[256];
gethostname(myname, 255);
host = myname;
}
else
host = argv[1];
/* Make the call to gethostbyname and report an error if no information is found. */
hostinfo = gethostbyname(host);
if(!hostinfo) {
fprintf(stderr, "cannot get info for host: %s\n", host);
exit(1);
}
/* Display the hostname and any aliases it may have. */
printf("results for host %s:\n", host);
printf("Name: %s\n", hostinfo -> h_name);
printf("Aliases:");
names = hostinfo -> h_aliases;
while(*names) {
printf(" %s", *names);
names++;
}
printf("\n");
/* Warn and exit if the host in question isn't an IP host. */
if(hostinfo -> h_addrtype != AF_INET) {
fprintf(stderr, "not an IP host!\n");
exit(1);
}
/* Otherwise, display the IP address(es). */
addrs = hostinfo -> h_addr_list;
while(*addrs) {
char *ip_str = inet_ntoa(*(struct in_addr *)*addrs);
printf(" %s", ip_str);
/* <BEGIN> Get the host name by IP address */
struct in_addr addr = {0};
if (!inet_aton(ip_str, &addr)) {
printf("Cannot parse IP %s\n", ip_str);
exit(1);
}
struct hostent *remoteHost = gethostbyaddr((void*)&addr, sizeof(addr), AF_INET);
if (remoteHost == NULL) {
printf("\nInvalid remoteHost\n");
exit(1);
}
printf("\nOfficial name: %s\n", remoteHost->h_name);
char **pAlias;
for(pAlias=remoteHost->h_aliases; *pAlias != 0; pAlias++) {
printf("\tAlternate name: %s\n", *pAlias);
}
/* <End> */
addrs++;
}
printf("\n");
exit(0);
}
/*測試運行*/爲什麼gethostbyaddr沒有爲www.google.com的www.yahoo工作
[email protected]:~/Documents/C$ ./getname2way www.yahoo.com
results for host www.yahoo.com:
Name: any-fp.wa1.b.yahoo.com
Aliases: www.yahoo.com fp.wg1.b.yahoo.com
209.191.122.70
Official name: ir1.fp.vip.mud.yahoo.com
/*試運行www.google.com */
[email protected]:~/Documents/C$ ./getname2way www.google.com
results for host www.google.com:
Name: www.l.google.com
Aliases: www.google.com
74.125.225.83
Invalid remoteHost
爲什麼該代碼不適用於www.google.com?
爲gethostbyaddr的代碼是從http://www.unix.com/man-page/FreeBSD借/ 3/gethostbyaddr / – q0987