如何区分以太网与其他网络?

时间:2011-11-12 01:51:31

标签: c linux networking

有人在Get the IP address of the machine的答案中建议,可以使用getifaddrs()来获取程序运行的机器的IP地址,效果很好:D:D

但是,在两个不同的系统上运行相同的程序,一个显示

SERVER_ADDRESS lo 127.0.0.1
SERVER_ADDRESS eth0 129.xxx.xxx.xxx
SERVER_ADDRESS virbr0 192.zzz.zzz.1

而另一个显示

SERVER_ADDRESS lo0 127.0.0.1
SERVER_ADDRESS en0 192.yyy.yyy.yyy

我打算使用strcmp来区分以太网,但现在我意识到它不能跨系统工作,因为可能会打印出不同的字符串。

是否有功能(或更好的方法)来检查ifa_name是否是以太网?

3 个答案:

答案 0 :(得分:7)

要(再次)明确说明:127.0.0.0/255.0.0.0 net(范围)的所有地址,因为有127.0.0.0127.255.255.255的地址,被定义为被视为本地环回地址。发往此类的数据不会离开本地机器。

无论如何,因为你已经在使用getifaddrs()直播了很简单.. - 只需测试ifa_flagsstruct ifaddrs返回的结构IFF_LOOPBACK的成员#include <sys/types.h> #include <ifaddrs.h> #include <net/if.h> /* for IFF_LOOPBACK */ ... struct ifaddrs * pIfAddrs = NULL; if (!getifaddrs(&pIfAddrs)) { /* Test if the first interface is looping back to the local host. */ int iIsLoopBack = (0 != (pIfAddrs->ifa_flags & IFF_LOOPBACK)); ... } ... /* clean up */ if (pIfAddrs) { freeifaddrs(pIfAddrs); pIfAddrs = NULL; } ... ,如下所示:

{{1}}

答案 1 :(得分:2)

你可能遇到的不仅仅是那个问题..例如,有多个网卡,vLAN,看起来像LANS的WANS,反之亦然等等。

知道什么? 127.X.X.X抛弃那个结果,你就得到了非环回。

如果您想知道地址是否为私人地址.. you'll then have to go down this road.

答案 2 :(得分:1)

/* Output:
Name: 'eth0' Addr: 'xxx.xxx.xxx.xxx'
Name: 'eth0:0' Addr: 'xxx.xxx.xxx.xxx'
*/

    struct ifaddrs *ifaddr;
    char ip[255];

    if (getifaddrs(&ifaddr) == -1)
       {
          //sprintf(ip[0], "%s", strerror(errno));
       }
       else
       {
          struct ifaddrs *ifa;
          int i = 0, family;
          for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
          {
             if (ifa->ifa_addr == NULL)
             {
                continue;
             }
             family = ifa->ifa_addr->sa_family;
             if (family == AF_INET || family == AF_INET6)
             {
                if(!(ifa->ifa_flags & IFF_LOOPBACK) && (family == AF_INET) && getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), ip, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == 0)
                {
                   printf("Name: '%s' Addr: '%s'\n", ifa->ifa_name, ip);
                }
             }
          }
       }
       freeifaddrs(ifaddr);