wake-up-neo.com

Wie bekomme ich die IP-Adresse von der Sockenstruktur in c?

Ich schreibe einen einfachen Server/Client und versuche, die IP-Adresse des Clients abzurufen und auf der Serverseite zu speichern, um zu entscheiden, welcher Client in den kritischen Bereich gelangen soll. Ich habe es mehrmals gegoogelt, konnte aber keinen richtigen Weg finden, um die IP-Adresse aus der Sockenstruktur zu erhalten.

Ich glaube, dass dies eine Möglichkeit ist, IP von der Sockenstruktur abzurufen, nachdem der Server eine Anfrage vom Client akzeptiert hat. Genauer gesagt in c nach dem Server ausführen

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

Vielen Dank

34
REALFREE

Wenn Sie IPV4 verwenden, gehen Sie folgendermaßen vor:

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

Wenn Sie die IP-Adresse dann als Zeichenfolge haben möchten, 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 einen String zu bekommen ist fast identisch mit IPV4

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

Die einfachere und korrekte Methode zum Extrahieren von IP-Adresse und Portnummer ist:

printf("IP address is: %s\n", inet_ntoa(client_addr.sin_addr));
printf("port is: %d\n", (int) ntohs(client_addr.sin_port));

Die von der SoapBox akzeptierte Antwort ist nicht für alle Architekturen korrekt. Siehe Big und Little Endian .

35
Misha

Angenommen, client_addr Ist ein struct sockaddr_in (Was es normalerweise ist). Sie können die IP-Adresse (als 32-Bit-Ganzzahl ohne Vorzeichen) aus client_addr.sin_addr.s_addr Abrufen.

Sie können es folgendermaßen in einen String konvertieren:

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));
25
SoapBox