Как отличить Ethernet от других? - PullRequest
0 голосов
/ 12 ноября 2011

Было предложено в ответе здесь: Получить IP-адрес машины , можно использовать 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 чтобы дифференцировать Ethernet, но теперь я понял, что он не работает в разных системах, поскольку могут быть распечатаны разные строки.

Есть ли функция (или лучший способ) проверить, является ли ifa_name ethernetили нет?

Ответы [ 3 ]

7 голосов
/ 12 ноября 2011

Чтобы (снова) заявить об этом явно: Все адреса 127.0.0.0/255.0.0.0 net (диапазон), поскольку существуют адреса от 127.0.0.0 до 127.255.255.255, определяются как локальные петлевые адреса. Данные, адресованные такому, не будут покидать локальную машину.

В любом случае, поскольку вы уже используете getifaddrs(), это просто - просто ... - просто протестируйте элемент ifa_flags структур (ы) struct 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;
}

...
2 голосов
/ 12 ноября 2011

Вы, вероятно, столкнетесь не только с этой проблемой ... скажем, например, есть несколько сетевых карт, виртуальных локальных сетей, WANS, которые выглядят как LANS, и наоборот и т. Д.

Что известно?127.X.X.X Отбросьте этот результат, и вы получите не-петли.

Если вы хотите знать, является ли адрес частным или нет .. вам придется идти по этому пути.

1 голос
/ 31 октября 2013
/* 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...