golang unterscheidet IPv4 IPv6
Für ein Programm mit dem ich arbeite, habe ich, um zu überprüfen, ob eine IP-Adresse (die IP, die verbindet mich mit dem Internet) privat oder öffentlich ist. Für dass, ich brauche, um zu unterscheiden, ob eine IP-Adresse für IPv4-oder IPv6.
Wollte ich es überprüfen, indem Sie die Länge des IP -:
conn, err := net.Dial("udp", "8.9.10.11:2342")
if err != nil {
fmt.Println("Error", err)
}
localaddr := conn.LocalAddr()
addr, _ := net.ResolveUDPAddr("udp", localaddr.String())
ip := addr.IP
fmt.Println(ip)
fmt.Println(len(ip))
Gut, meine IP ist 192.168.2.100, also IPv4, aber len(ip) sagt mir, dass die Länge ist 16, das wäre IPv6.
Was ist mein Fehler? Jede andere Methode existiert, um zu unterscheiden zwischen IPv4-und IPv6-das funktioniert immer?
InformationsquelleAutor der Frage user3479275 | 2014-03-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
jimt s Antwort ist korrekt, aber ziemlich kompliziert. Ich würde einfach schauen
ip.To4() != nil
. Da die Dokumentation sagt, "wenn ip ist keine IPv4 Adresse, To4, wird nil zurückgegeben" sollte dieser Zustand zurücktrue
wenn und nur wenn die Adresse eine IPv4-Adresse.InformationsquelleAutor der Antwort Evan
Die Länge des IP ist fast immer 16, weil die interne Darstellung
net.IP
ist die gleiche für beide Fall. Von die Dokumentation:Trennung der beiden Typen hängt davon ab, wie die IP initialisiert wurde. Suche den code für
net.IPv4()
können Sie sehen, es ist initialisiert, um 16 bytes, für die die ersten 12 bytes sind der Wert derv4InV6Prefix
.Wo
v4InV6Prefix
ist definiert als:Wenn Sie möchten, eine zuverlässige Differenzierung, schauen, wie die Quelle für
net.IP.To4
Griffe:isZeros
nicht exportiert, so haben Sie zu kopieren, dass der code lokal. Dann können Sie einfach das gleiche tun wie oben zu bestimmen, ob Sie IPv4 oder IPv6.InformationsquelleAutor der Antwort jimt
Ich benutzen würde .To4(), .16() ,aus dem net-Paket zu finden, wenn es sich um eine IPv4-oder IPv6-Adresse.
überprüfen Sie die blog-post. überprüfen Sie den letzten Abschnitt des Blogs, zum Beispiel, könnte Ihnen helfen.
InformationsquelleAutor der Antwort srini
govalidator prüft das Vorhandensein von
:
im string.InformationsquelleAutor der Antwort Zamicol
Den akzeptierte Antwort von Evan (
ip.To4() != nil
) löst die Frage. Allerdings gab es einige Kommentare und andere Antworten, die überprüfen, ob die Darstellung ist IPv4 oder IPv6, und Sie sind nicht immer genau:HINWEIS: EIN paar von Listen von gültigen IPv4-und IPv6-gültige Notationen bzw. Folgen. Jeder Eintrag repräsentiert eine variation über das erste basic. Die Variationen kombiniert werden können, wie gewünscht, aber aus Platzgründen keine variation-Kombination aufgeführt ist, ausgenommen zur Beseitigung von Mehrdeutigkeit.
Gültige IPv4-Notationen:
"192.168.0.1"
: basic"192.168.0.1:80"
: mit port infoGültige IPv6-Notationen:
"::FFFF:C0A8:1"
: basic"::FFFF:C0A8:0001"
: führende Nullen"0000:0000:0000:0000:0000:FFFF:C0A8:1"
: Doppel-Doppelpunkt erweitert"::FFFF:C0A8:1%1"
: mit zone info"::FFFF:192.168.0.1"
: IPv4-literal"[::FFFF:C0A8:1]:80"
: mit port info"[::FFFF:C0A8:1%1]:80"
: mit zone und die port-infoAll diesen Fällen (sowohl IPv4 und IPv6-Listen) würde als IPv4-Adressen, die von die
net
- Paket.Die IPv4-literal variation der IPv6-Liste als IPv4 durch govalidator.
Der einfachste Weg, um zu überprüfen, ob es ist eine IPv4-oder IPv6-Adresse wäre die folgende:
InformationsquelleAutor der Antwort Adirio