Standard/sichere Weg, um zu überprüfen, ob IP-Adresse im range/Subnetz
Habe ich ein kleines Stück code, konvertiert ein 32-bit unsigned integer (ie: uint32_t
) in eine Reihe von vier 8-bit-Felder, behandelt Sie wie eine IP-Adresse und die Berichte dann an den client, wenn es fällt, innerhalb eines vorbestimmten Bereichs von IP-Adressen.
Habe ich schon gefunden ein paar verschiedene Beispiele von code in C, die mir zeigt, wie man die IP-Adresse eines Clients aus der struct sockaddr_in
, die es enthält, zusammen mit einem C# - Antwort. Allerdings würde ich gerne brechen die Adresse ein bisschen weiter, halten Sie es in reinem C, und wollte ein paar schnelle Dinge:
- Ist die interne Darstellung konsistent von system zu system, oder muss ich Sie jemals brauchen werden, zu tun Endian-ness überprüft/Korrektur auf die
s_addr
Feld? - Gibt es standard-Makros entlang der Linien von
CLASS_C_NETMASK
,CLASS_B_NETMASK
usw, das wäre besser geeignet als die Verwendung von manuell erzeugten Masken (ie:0xFF000000
,0x00FF0000
etc). - Gibt es bereits Funktionen in der sockets-Bibliothek, die nicht prüft, ob eine IP-Adresse ist in einen Bereich von IP-Adressen oder passt die Subnetz-Maske?
Dank.
s_addr
ist immer in "network byte order", das ist big-endian.- Sie können nicht schief gehen auf der Suche auf Beej ' s Guide to Network Programming. Fügen Sie, dass Ihre Liste von Referenzen/Beispiele zu überprüfen. (seine anderen guides sind auch gut)
Du musst angemeldet sein, um einen Kommentar abzugeben.
s_addr
ist immer in Netz (big-endian) - byte-Reihenfolge auf allen Plattformen.Nein, noch würde es Sinn machen, zu verwenden, wie Makros, wie subnet-Masken sind nicht behoben, die von einem Netzwerk zum anderen. Sie müssen Ihren code mit einem tatsächlichen Netzwerk-IP und die Subnetzmaske (der Benutzer aufgefordert, die Abfrage des OS, etc). Sie können dann die Berechnung der Subnetz-Start-und End-IP-Adressen vergleichen Sie gegen Ihre Ziel-IP:
Oder einfacher, beide mask Netzwerk-IP und Ziel-IP-Adresse mit der Subnetz-Maske und sehen, ob die sich ergebenden Werte sind die gleichen (dh, Sie sind die gleichen Subnetz):
Nicht. Aber es ist trivial zu implementieren, manuell, dauert es nur ein paar Zeilen code, wie oben gezeigt.
netend
oder Sie könnte sich ändern<= netend
zu< netend
sein, oder Sie können die Maske Ziel-IP-Adresse mit dem inversen der Subnetz-Maske und sehen, ob das Ergebnis den gleichen Wert wie die Maske (wenn also das Ziel ist eine broadcast-IP).