erweitern Sie eine IPv6-Adresse, so kann ich drucken Sie auf die Standardausgabe

Ich bin mit getifaddrs() und inet_ntop (), um die ip-Adressen auf dem system. Wenn das system die IPv6-Adresse, die zurückgegeben wird, ist in der gekürzten version (mit :: für Nullen). Gibt es eine Möglichkeit zu erweitern, die Adresse zu einer vollen?

Dies ist der code den ich verwende:

struct ifaddrs *myaddrs, *ifa;
void *in_addr;
char buf[64];

if(getifaddrs(&myaddrs) != 0)
{
    perror("getifaddrs");
    exit(1);
}

for (ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next)
{
    if (ifa->ifa_addr == NULL)
        continue;
    if (!(ifa->ifa_flags & IFF_UP))
        continue;

    switch (ifa->ifa_addr->sa_family)
    {
        case AF_INET:
        {
            struct sockaddr_in *s4 = (struct sockaddr_in *)ifa->ifa_addr;
            in_addr = &s4->sin_addr;
            break;
        }

        case AF_INET6:
        {
            struct sockaddr_in6 *s6 = (struct sockaddr_in6 *)ifa->ifa_addr;
            in_addr = &s6->sin6_addr;
            break;
        }

        default:
            continue;
    }

    if (!inet_ntop(ifa->ifa_addr->sa_family, in_addr, buf, sizeof(buf)))
    {
        printf("%s: inet_ntop failed!\n", ifa->ifa_name);
    }
    else
    {
        printf("IP address: %s\n", buf);
    }
}

freeifaddrs(myaddrs);

Code wird sehr geschätzt.

EDIT:

Da dies ist offenbar sehr schwer zu begreifen, ich werde Ihnen ein Beispiel geben:

Wenn ich abcd:12::3 ich brauche, um es zu erweitern, um abcd:0012:0000:0000:0000:0000:0000:0003

Der Grund? denn es ist Teil der Anforderungen. So einfach ist das.

  • die verkürzte version ist eine gültige ipv6-Adresse - also warum würden Sie wollen, um es zu erweitern?
  • weil ich brauche, um es zu speichern in voller Höhe in unserer Datenbank. das ist die Voraussetzung.
  • Sie speichern es als ein 128-bit integer, korrekt? Da das speichern Sie es als eine textliche Darstellung ist etwas sinnlos - es gibt IPv6-Adressen, können auf unterschiedliche Weise dargestellt werden, eben weil der :: verkürzte syntax.
  • danke für die Erklärung. Allerdings bin ich immer noch in der Notwendigkeit, zu erweitern, die Adresse. unabhängig davon, wie Speicher ich es und was ich mit ihm tun.
  • denke, dass die Art und Weise Sie speichern es nicht egal - zwei BIGINTs gegen einen CHAR, aber trotzdem) Könnte Sie es konvertieren, um die ganze Zahl und dann bit-shift und konvertieren in hex? So sollten Sie die ungekürzte version. Auch, check this out: stackoverflow.com/q/1120371/19746
  • Ok, ich mache es einfacher für Sie. Ich brauche, um es zu speichern in einem string. char*, char[] oder was auch immer. Ich muss nur die Adresse speichern. das ist alles, was ist daran so schwer zu verstehen? Ich fragte eine sehr spezifische Frage. Ich kümmern sich nicht um SQL-Datenbanken.
  • Einfacher für mich?!? Die verlinkten Frage hat eine Funktion, um dies zu tun, müssen Sie nur die Portierung in c.
  • Was ich meinte, es ist ich mache es einfacher für Sie zu verstehen da ich nicht weiß, ob Sie verstanden die Frage. Ich werde machen es sogar einfacher (und ich werde Sie Bearbeiten die Frage-Titel so gut wie alle verstehen) ich muss eine Ausgabe auf stdout, die IPv6 voll ausgebaut. danke.
  • Oh, ok, jetzt verstehe ich es 🙂 Du hast erwähnt Sie in der Datenbank gespeichert, das ist wahrscheinlich das, was verwirrt mich. Eh, ich meinte diese Antwort - es hat nichts zu tun mit einer Datenbank, und die genannten Funktionen scheint es nicht zu sein, genau das, was Sie für Fragen: stackoverflow.com/questions/1120371/...
  • danke. Ich schaute auf den code, und ich verstehe wirklich nicht, was es tut. welche Funktion macht was? Neben python ist ein no go für mich. trotzdem danke.
  • Ihre Voraussetzungen sind falsch. Finden Sie in RFC 5952 "Eine Empfehlung für IPv6 Address Text Representation"
  • Nein. Empfehlungen, die nicht den Anforderungen entsprechen, sind falsch. Wenn die Sortierreihenfolge (Datenbank!) wichtig ist, RFC 5952, ist ein komplettes Chaos.
  • Wenn Sie das Sortieren von IP-Adressen in einer Datenbank, Sie don ' T vergleichen Sie Sie als text.
  • Ich brauche die Abfrage einer DNS-blacklist, und es erfordert eine Erweiterung der IPv6-Adresse. Vielen Dank für die Frage, Jessica!

InformationsquelleAutor Jessica | 2010-09-16
Schreibe einen Kommentar