2016-06-13 8 views
3

Ich habe zwei IPv6-Adresse in Struktur gespeichert. Ich würde gern herausfinden, welches kleiner ist, ohne memcmp zu verwenden. Gibt es eine bessere Möglichkeit, IPv6-Adressen zu vergleichen?wie IPP6-Adresse in c ohne Verwendung von memcmp zu vergleichen

struct in6_addr { 
     unsigned char s6_addr[16]; /* IPv6 address */ 
}; 
+0

Was die Typdefinition von 'struct in6_addr' ist? – user694733

+0

Warum nicht iterieren über 's6_addr' Feld, um es eins nach dem anderen mit weniger als Operator zu vergleichen? – Garf365

+1

Und warum können Sie 'memcmp' nicht auf 2' s6_addr' Mitgliedern verwenden? Scheint wie der einfachste Weg, den Vergleich zu machen. – user694733

Antwort

1

In einem allgemeinen Standpunkt aus: schreiben, was Sie, keine Funktionen oder Tricks anwenden, um zu erreichen, was Sie wollen, tun wollen! Wenn Sie ip v6 vergleichen möchten, definieren Sie zunächst, wie Sie es vergleichen und wie Sie es definiert haben.

Verwenden Sie also nicht memcmp, wenn Sie logische Daten vergleichen möchten. Verwenden Sie es nur, wenn Sie direkten Rohspeicher vergleichen möchten.

Zum Beispiel, wenn Sie entscheiden, dass Sie jedes Element von IPv6- und ersten verschiedenen Elementen vergleichen haben, sagt Beziehung zwischen zwei ipv6, schreibt sie:

// Not checked code, just an example 
// Return 0 if ipA == ipB, -1 if ipA < ipB and 1 if ipA > ipB 
int compare_ipv6(struct in6_addr *ipA, struct in6_addr *ipB) 
{ 
    int i = 0; 
    for(i = 0; i < 16; ++i) // Don't use magic number, here just for example 
    { 
     if (ipA->s6_addr[i] < ipB->s6_addr[i]) 
      return -1; 
     else if (ipA->s6_addr[i] > ipB->s6_addr[i]) 
      return 1; 
    } 
    return 0; 
} 
+0

1) Kurz 2) -> für Zeiger. 3) Wenn wahr oder falsch ein Ergebnis ist, gebe nicht "int" sondern "bool" zurück. 'bool compare_ipv6 (struct in6_addr * ipA, struct in6_addr * ipB, int len) { für (int i = 0; i s6_addr [i]! = ipB-> s6_addr [i]) Rückgabe false; Rückkehr wahr; } ' –

+0

@John_West getan. Vielen Dank für Ihre Kommentare – Garf365

+0

Über den dritten Punkt: Entschuldigung, stimme zu! Und über den ersten Punkt: Sie können 'result' Variable und' (result == 0) 'Bedingung mit' return' loswerden. Außerdem macht der Code jetzt keinen richtigen Vergleich: Sie sollten sofort '<' or '>' ' –