2013-11-26 142 views
0

对于某些LAN中的某些套接字通信应用程序,我的目标机器对于IPv4具有192.168.98.91getaddrinfo()返回回送地址

当我试着使用的getaddrinfo解析名称IP地址()返回127.0.0.1

我怎样才能得到192.168.98.91

我在/etc/hosts文件中设置为192.168.98.91myhost平我也到myhost显示192.168.98.91如IP地址。

我的机器是CentOS6.4。

这是/ etc/hosts的设置。

192.168.98.91 myhost 
127.0.0.1 myhost localhost.localdomain 

这是我的代码。

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <errno.h> 
#include <arpa/inet.h> 

int 
main(int argc,char *argv[]){ 
    int sock; 
    struct addrinfo hints,*res; 
    int n; 
    int err; 
    if(argc != 2){ 
     fprintf(stderr,"Usage : %s dst \n",argv[0]); 
     return 1; 
    } 
    memset(&hints,0,sizeof(hints)); 
    hints.ai_family = AF_UNSPEC; 
    hints.ai_socktype = SOCK_DGRAM; 
    err = getaddrinfo(argv[1],"12345",&hints,&res); 
    if(err != 0){ 
     perror("getaddrinfo"); 
     printf("getaddrinfo %s\n",strerror(errno)); 
     printf("getaddrinfo : %s \n",gai_strerror(err)); 
     return 1; 
    } 

    sock = socket(res->ai_family,res->ai_socktype,0); 
    if(sock < 0){ 
     perror("socket"); 
     return 1; 
    } 
    { 
     const char *ipverstr; 
     switch (res->ai_family){ 
      case AF_INET: 
       ipverstr = "IPv4"; 
       break; 
      case AF_INET6: 
       ipverstr = "IPv6"; 
       break; 
      default: 
       ipverstr = "unknown"; 
       break;    
     } 
     printf("ipverstr = %s\n ",ipverstr);    
    } 
    n = sendto(sock,"HELLO",5,0,res->ai_addr,res->ai_addrlen); 
    //n = sendto(sock,"HELLO", 5, 0,(struct sockaddr *)addr, sizeof(addr)); 
    if(n<1){ 
     perror("sendto"); 
     { 

     } 
     return 1; 
    } 
    struct sockaddr_in *addr; 
    addr = (struct sockaddr_in *)res->ai_addr; 
    printf("inet_ntoa(in_addr)sin = %s\n",inet_ntoa((struct in_addr)addr->sin_addr)); 

    printf("############ finish !! #######\n"); 
    close(sock); 
    freeaddrinfo(res); 
    return 0; 
} 
+2

显示getaddrinfo()实际使用情况的代码似乎对了解其中的错误至关重要。敢于向我们展示......! ;-) – alk

+0

你是否走过getaddrinfo返回的地址链表? – Stuart

+0

你是否浏览过这个列表? getaddrinfo()可能会给你多个地址。 – Zhongzhi

回答

5

如果你遵循使用struct addrinfoai_next成员由getaddrinfo()返回的结果链也会得到192.168.98.91myhost

这里http://man7.org/linux/man-pages/man3/getaddrinfo.3.html你找到一个完整的例子还展示了如何做到这一点:

从上面的链接:

 ... 
     s = getaddrinfo(NULL, argv[1], &hints, &result); 
     if (s != 0) { 
      fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s)); 
      exit(EXIT_FAILURE); 
     } 

     /* getaddrinfo() returns a list of address structures. 
      Try each address until we successfully bind(2). 
      If socket(2) (or bind(2)) fails, we (close the socket 
      and) try the next address. */ 

     for (rp = result; rp != NULL; rp = rp->ai_next) { 
      /* Do something with rp->ai_family, rp->ai_socktype, ... */ 
     } 
     ... 

从该行删除myhost/etc/hosts

127.0.0.1 myhost localhost.localdomain 

会导致127.0.0.1当询问myhost时不再被getaddrinfo()返回。

+0

现在我可以看到'192.168.98.91'。 – user1345414