Cum se diferențiază ethernet de ceilalți?

A fost sugerat într-un răspuns aici, Obțineți adresa IP a mașină , s-ar putea folosi getifaddrs() pentru a obține adresa IP a mașinii pe care rulează programul, lucru care a funcționat excelent: D: D

Cu toate acestea, executați același program pe două sisteme diferite, unul afișat

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

în timp ce celălalt este afișat

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

Aveam de gând să folosesc strcmp pentru a diferenția eternetul, dar acum mi-am dat seama că nu funcționează între sisteme deoarece pot fi tipărite diferite șiruri de caractere.

Există o funcție (sau o modalitate mai bună) de a verifica dacă un ifa_name este sau nu este ethernet?

0
ifconfig arată că interfața localhost are proprietatea LOOPBACK . Poate că informațiile pot fi extrase în C într-un fel.
adăugat autor Kerrek SB, sursa
Un scurt timp ping ar însemna localhost;)
adăugat autor mike jones, sursa

3 răspunsuri

Pentru a afișa explicit acest lucru: Toate adresele net (intervalul) 127.0.0.0/255.0.0.0 , deoarece există adrese de la 127.0.0.0 la 127.255.255.255 , se definesc a fi tratate ca adrese de loopback locale. Datele adresate acestora nu vor părăsi mașina locală.

Oricum, pe masura ce deja folositi getifaddrs() live este usor .. - testati doar ifa_flags al structurii struct ifaddrs pentru IFF_LOOPBACK cum ar fi:

#include 
#include 
#include  /* 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;
}

...
7
adăugat
Multumesc @alk, cautam ceva de genul asta! Există o pagină a unui om care discută despre IFF_XXX diferite? Trebuie să identific eticheta ethernet în mod special pentru că arată, de asemenea, virbr0 192.zzz.zzz.z . Mă tem că IFF_LOOPBACK nu va exclude 192.zzz.zzz.zzz
adăugat autor Some Noob Student, sursa
Am citit aici kernel.org/doc /man-pages/online/pages/man7/netdevice.7.html referitoare la diferite tipuri de ifa_flags . Ați putea indica care steaguri pot identifica o conexiune ethernet? Mulțumiri!
adăugat autor Some Noob Student, sursa
@sheldon Diferența dintre modelul 127.x.y.z. adresele și adresele utilizate pe internet și diferența dintre adresa 127.x.y.z. adresele celor menționate în referința postată de alex gri sunt diferite. ;-) Fie ca acestea din urmă să fie private prin convenție, dar nu în modul în care sunt tratate tehnic, 127.x.y.z sunt tratate privat din punct de vedere tehnic, deoarece nu sunt direcționate către exteriorul gazdei care le folosește. Așadar, diferențierea adreselor la care se face referire prin griul alex trebuie făcută prin testarea efectivă a valorilor adreselor. Interfețele pentru a detecta numai adresa 127.x.y.z ca fiind privată (locală).
adăugat autor alk, sursa
Puteți să aruncați o privire la sursele pachetului net-tools din care, de asemenea, ajungeți la ifconfig pentru a vedea cum se poate face acest lucru ... și multe alte lucruri. De asemenea, aș fi putut face acest lucru acum pentru a scoate câteva exemple pentru tine, dar, deoarece este o duminică însorită, prefer să mergi pe jos astăzi ... ;-)
adăugat autor alk, sursa
Puteți extrage sursele originale de instrumente de rețea de aici:
adăugat autor alk, sursa

Probabil că veți avea parte de mai mult de această problemă .. spunem de exemplu că există mai multe rețele NIC, VLAN, WANS care arată ca LANS și invers, etc.

Ce este cunoscut? 127.X.X.X Aruncați rezultatul respectiv și aveți neclintiturile.

If you want to know if the address is private or not.. you'll then have to go down this road.

2
adăugat
/* 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);
1
adăugat