Hoe ethernet van de anderen te onderscheiden?

Hier werd in een antwoord voorgesteld, Download het IP-adres van de machine , zou je getifaddrs() kunnen gebruiken om het IP-adres te verkrijgen van de machine waarop het programma draaide, wat prima werkte: D: D

Als hetzelfde programma op twee verschillende systemen wordt uitgevoerd, wordt er één weergegeven

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

terwijl de andere wordt weergegeven

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

Ik wilde strcmp gebruiken om ethernet te onderscheiden, maar nu realiseerde ik me dat het niet op verschillende systemen werkt, omdat verschillende strings kunnen worden afgedrukt.

Is er een functie (of betere manier) om te controleren of een ifa_name al dan niet ethernet is?

0
ifconfig geeft aan dat de localhost-interface de eigenschap LOOPBACK heeft. Misschien kan die informatie op de een of andere manier in C worden geëxtraheerd.
toegevoegd de auteur Kerrek SB, de bron
Een korte ping-tijd zou localhost betekenen;)
toegevoegd de auteur mike jones, de bron

3 antwoord

Om dit (nogmaals) expliciet te vermelden: alle adressen van het 127.0.0.0/255.0.0.0 net (bereik) aangezien er adressen zijn van 127.0.0.0 naar 127.255.255.255 , zijn gedefinieerd om te worden behandeld als local loopback-adressen. Gegevens die hiertoe zijn geadresseerd, verlaten de lokale machine niet.

Hoe dan ook, aangezien u al getifaddrs() live gebruikt, is eenvoudig .. - test het lid ifa_flags van de structuur (en) struct ifaddrs geretourneerd voor IFF_LOOPBACK zoals zo:

#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
toegevoegd
Bedankt @alk, ik was op zoek naar zoiets als dit! Is er een manpagina die over verschillende IFF_XXX spreekt? Ik moet specifiek ethernet identificeren omdat het ook virbr0 192.zzz.zzz.z toont. Ik vrees dat IFF_LOOPBACK 192.zzz.zzz.zzz niet zal uitsluiten
toegevoegd de auteur Some Noob Student, de bron
Ik heb hier gelezen kernel.org/doc /man-pages/online/pages/man7/netdevice.7.html met betrekking tot verschillende soorten ifa_flags . Kunt u aangeven welke vlaggen mogelijk een ethernetverbinding kunnen identificeren? Bedankt!
toegevoegd de auteur Some Noob Student, de bron
@sheldon Het verschil tussen de 127.x.y.z. adressen en adressen gebruiken op internet en het verschil van de 127.x.y.z. adressen voor die vermeld in de referentie gepost door alex grijs is anders. ;-) Laat laatstgenoemden privé zijn volgens conventie maar niet op de manier waarop ze technisch worden behandeld, de 127.x.y.z worden privé technisch behandeld, omdat ze niet naar de buitenkant van de host worden gerouteerd die ze gebruikt. Het onderscheiden van de adressen waarnaar alex grijs verwijst, moet dus worden gedaan door de waarden van de adressen daadwerkelijk te testen. De interfaces om alleen 127.x.y.z-adressen te detecteren als privé (lokaal).
toegevoegd de auteur alk, de bron
Je zou eens kunnen kijken naar de bronnen van het net-gereedschapspakket waaruit ook ifconfig komt om te zien hoe dit kan worden gedaan ... en nog veel meer andere dingen. Ik had dit nu ook kunnen doen om wat voorbeelden voor je uit te trekken, maar aangezien het een zonnige zondag is, ga ik vandaag liever wandelen ... ;-)
toegevoegd de auteur alk, de bron
U kunt de originele bronnen voor net-tools hier vandaan ophalen: ftp.de.debian.org/debian/pool/main/n/net-tools/… (kijk rond in lib/interface.c en lib/hw.c ) en hebben ook een mooie en zonnige dag! :-)
toegevoegd de auteur alk, de bron

U zult waarschijnlijk meer dan alleen dat probleem tegenkomen. Stel bijvoorbeeld dat er meerdere NIC's, vLAN's, WANS zijn die op LANS lijken en omgekeerd, enz.

Wat is bekend? 127.X.X.X Gooi dat resultaat weg en je hebt niet-loopbacks.

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

2
toegevoegd
/* 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
toegevoegd