Wie bekomme ich eine IP-Adresse aus der Sockenstruktur in c?

Lesezeit: 3 Minuten

Benutzeravatar von REALFREE
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

csock = accept(ssock, (struct sockaddr *)&client_addr, &clen) 

Vielen Dank

Benutzeravatar von Goz
Göz

OK, vorausgesetzt, Sie verwenden IPV4, dann gehen Sie wie folgt vor:

struct sockaddr_in* pV4Addr = (struct sockaddr_in*)&client_addr;
struct in_addr ipAddr = pV4Addr->sin_addr;

Wenn Sie dann die IP-Adresse als Zeichenfolge wünschen, gehen Sie wie folgt vor:

char str[INET_ADDRSTRLEN];
inet_ntop( AF_INET, &ipAddr, str, INET_ADDRSTRLEN );

IPV6 ist auch ziemlich einfach …

struct sockaddr_in6* pV6Addr = (struct sockaddr_in6*)&client_addr;
struct in6_addr ipAddr       = pV6Addr->sin6_addr;

und das Abrufen einer Zeichenfolge ist fast identisch mit IPV4

char str[INET6_ADDRSTRLEN];
inet_ntop( AF_INET6, &ipAddr, str, INET6_ADDRSTRLEN );

  • 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

Mishas Benutzeravatar
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:

printf("%d.%d.%d.%d\n",
  int(client.sin_addr.s_addr&0xFF),
  int((client.sin_addr.s_addr&0xFF00)>>8),
  int((client.sin_addr.s_addr&0xFF0000)>>16),
  int((client.sin_addr.s_addr&0xFF000000)>>24));

  • 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

1407580cookie-checkWie bekomme ich eine IP-Adresse aus der Sockenstruktur in c?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy