2013-11-26 24 views
0
/* program to print the IP address of the Host*/ 
------------------------------------------------ 

我正在尝试打印主机IP地址。当我执行下面的程序 我得到的回环地址是127.0.0.1。我应该更改以获取 的实际IP地址。获取环回地址而不是实际地址?

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

int main()  { 

     void *addr; 
     char ipstr[INET6_ADDRSTRLEN]; 
     int rv; 
     struct addrinfo hints, *res, *p; 

     memset (&hints, 0, sizeof hints); 
     hints.ai_family = AF_UNSPEC; 
     hints.ai_socktype = SOCK_STREAM; 
     //hints.ai_flags = AI_ADDRCONFIG; 
     hints.ai_flags = AI_PASSIVE; 

     if ((rv = getaddrinfo(NULL ,"3490" , &hints, &res)) != 0) { 
       fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
       return 1; 
     } 

     for(p = res;p != NULL; p = p->ai_next) { 

       struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr; 
       addr = &(ipv4->sin_addr); 
       inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr); 
       printf(" %s\n", ipstr); 
     } 

} 
+0

回送地址*是*实际地址。如果你想得到conencted * hardware *接口的地址,那么你必须求助于平台特定的代码。如果你只是搜索一下,有很多例子。 –

+1

哦,顺便说一下,如果您在列表中获得IPv6地址,该怎么办?那么'p-> ai_addr'不会是'sockaddr_in'指针,因此访问'ipv4-> sin_addr'是未定义的行为。 –

+0

您可以使用'getifaddrs()'获取本地接口的IP地址,请参阅(例如):http://stackoverflow.com/a/12883978/1187415。 –

回答

0

只要你的开发机没有连接到网络,你会得到回送地址(这当然是完全合法的本地网络)。只要将机器连接到网络,您就可以确定“正确”的地址。 ipconfig,顺便说一句,表现相同。

如果您调用getaddrinfo,其节点名称(第一个参数)为NULL,则与使用“localhost”调用它时相同。你会得到回送IP。但是,如果您使用“真实”主机名,您将获得“真实”IP。

+0

我的机器在网络中。当我做ifconfig时,我得到两个IP地址之一是172.28.3.225(实际IP),另一个是环回地址127.0.0.1。我该怎么做才能得到172.28.3.225 – user3035481

+0

请参阅更新(第二段)。 – JeffRSon

+0

当然可以,为什么不呢? – JeffRSon