Wie bekomme ich eine IP-Adresse aus der Sockenstruktur in c?
Lesezeit: 3 Minuten
ECHTFREI
Ich schreibe einen einfachen Server/Client und versuche, die IP-Adresse des Clients abzurufen und sie auf der Serverseite zu speichern, um zu entscheiden, welcher Client in den kritischen Abschnitt gelangen soll. Ich habe es mehrmals gegoogelt, konnte aber keinen richtigen Weg finden, um die IP-Adresse von der Sockenstruktur zu erhalten.
Ich glaube, dies ist eine Möglichkeit, IP von der Sockenstruktur zu erhalten, nachdem der Server die Anfrage vom Client akzeptiert hat. Genauer gesagt in c nach der Serverausführung
Sie haben vergessen, die zu bestehen str Puffer zu inet_ntop(). Und sin_addr ist eine Struktur – man muss sie verwenden sin_addr.s_addr. Erwähnenswert ist, dass die IPv4-Adresse in der Netzwerk-Byte-Reihenfolge gespeichert wird und dass man sie verwenden müsste, um sie als Hexadezimalzahl zu sehen ntohl(pV4Addr->sin_addr.s_addr).
– Dummy00001
17. Juni 2010 um 12:22 Uhr
Punkte genommen … Sie haben auch übersehen, dass ich keinen Kleinbuchstaben “in6_addr” verwende;) An der ntohl-Front mache ich mir nicht oft die Mühe, da ich immer noch Gleichheitsprüfungen durchführen kann (vorausgesetzt, beide sind in Netzwerkreihenfolge) und es würde das inet_ntop ( nicht wahr?).
– Göz
17. Juni 2010 um 12:58 Uhr
Diese Frage ist mit C gekennzeichnet – Sie können das nicht auslassen struct in Typen wie struct sockaddr_in *. Auch sollte die IPV4-Methode verwendet werden struct in_addr Anstatt von int Adressen zu speichern, analog zu der von Ihnen gezeigten IPV6-Methode.
– Café
18. Juni 2010 um 5:57 Uhr
Mischa
Der einfachere und korrekte Weg zum Extrahieren von IP-Adresse und Portnummer wäre:
printf("IP address is: %s\n", inet_ntoa(client_addr.sin_addr));
printf("port is: %d\n", (int) ntohs(client_addr.sin_port));
Die akzeptierte Antwort der SoapBox ist nicht für alle Architekturen korrekt. Sehen Big- und Little-Endian.
Vorausgesetzt client_addr ist ein struct sockaddr_in (was es normalerweise ist). Sie können die IP-Adresse (als 32-Bit-Ganzzahl ohne Vorzeichen) von erhalten client_addr.sin_addr.s_addr.
Sie können es auf diese Weise in einen String umwandeln:
Sie sollten inet_ntoa() verwenden, anstatt manuell mit den Bits herumzuspielen.
– Rémy Lebeau
18. Juni 2010 um 1:15 Uhr
inet_ntoa ist nicht Thread-sicher, obwohl dies für die meisten Fälle, in denen es verwendet wird, möglicherweise nicht wichtig ist. Eine sichere Alternative ist inet_ntop.
– jweyrich
29. April 2013 um 5:13 Uhr
@RemyLebeau Schön und einfach. Ich mag das.
– James
15. Mai 2017 um 21:14 Uhr
14075800cookie-checkWie bekomme ich eine IP-Adresse aus der Sockenstruktur in c?yes