2011-07-16 45 views
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?

+0

爲gethostbyaddr的代碼是從http://www.unix.com/man-page/FreeBSD借/ 3/gethostbyaddr / – q0987

回答

相關問題