2014-06-08 43 views
1

我有一個簡短的測試程序來獲取本地機器的IP地址。在Raspbian上,僅返回回送地址,而OS X上的相同代碼返回正常IP和回送IP。在raspbian上的getaddrinfo只返回loopback IP,在OS X上有相同的代碼

的代碼是

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <iostream> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <arpa/inet.h> 
#include <errno.h> 
using namespace std; 

int main (int argc, char * const argv[]) { 
    char hostname[128]; 

    int result = gethostname(hostname, 127); 
    if (result != 0) { 
    cout << "FATAL: gethostname failed: " << result << errno; 
    return -1; 
    } 
    cout << "Host name is " << hostname << endl; 

    struct addrinfo hints, *res; 
    int errcode; 
    char addrstr[100]; 
    void *ptr; 

    memset(&hints, 0, sizeof(hints)); 
    hints.ai_family = PF_UNSPEC; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_flags |= AI_CANONNAME; 

    errcode = getaddrinfo(hostname, NULL, &hints, &res); 
    if (errcode != 0) { 
    perror("getaddrinfo"); 
    return -1; 
    } 
    while(res) { 
    inet_ntop(res->ai_family, res->ai_addr->sa_data, addrstr, 100); 
    switch(res->ai_family) { 
     case AF_INET: 
     ptr = &((struct sockaddr_in *)res->ai_addr)->sin_addr; 
     break; 
     case AF_INET6: 
     ptr = &((struct sockaddr_in6 *)res->ai_addr)->sin6_addr; 
     break; 
     default: 
     cout << "Unknown family" << endl; 
    } 
    inet_ntop(res->ai_family, ptr, addrstr, 100); 
    printf("IPV%d address: %s (%s)\n", res->ai_family == PF_INET6 ? 6 : 4, addrstr, res->ai_canonname); 
    res = res->ai_next; 
    } 
    return 0; 
} 

在OS X上我得到:

[Coyote]collector$ ./quick 
Host name is Coyote.local 
IPV4 address: 192.168.1.108 (coyote.local) 
IPV6 address: fe80::223:dfff:fea0:a230 (coyote.local) 

但在Raspbian我只得到:

pi:~$ ./quick 
Host name is pi 
IPV4 address: 127.0.1.1 (pi) 

pi:~$ ifconfig 
eth0  Link encap:Ethernet HWaddr b8:27:eb:62:15:fc 
      inet addr:192.168.1.162 Bcast:192.168.1.255 Mask:255.255.255.0 
[...] 

我需要做Raspbian才能獲得正確結果?

回答

1

這可能是由於/etc/hosts文件的內容引起的。如果您的目標是獲取系統的IP地址,請考慮使用​​。它來自BSD,但也適用於Linux。

如果您想確定在某處連接時要使用哪個地址,最好的方法是使用getsockname連接並獲取地址。另一種選擇是讀取路由表。

另外,getnameinfo通常是比inet_ntop更好的選擇。

+0

謝謝。這工作。 – RussK

+0

有趣的一面是:我實際上需要Ruby on Rails應用程序中的這些信息。經過痛苦的工作之後,我不得不通過Ruby來使getifaddrs可用,我想,沒有什麼期望,去尋找一個Ruby gem。令我驚訝的是,我找到了[system-getifaddrs](https://rubygems.org/gems/system-getifaddrs)gem,它以散列形式返回結果,其中接口是鍵,值是散列值。尼斯。 – RussK

相關問題