web-dev-qa-db-fra.com

Comment obtenir l'adresse IP de la structure de chaussette en c?

J'écris un serveur/client simple et j'essaie d'obtenir l'adresse IP du client et de l'enregistrer côté serveur pour décider quel client doit entrer dans la section critique. Je l'ai googlé plusieurs fois mais je n'ai pas trouvé de moyen approprié d'obtenir l'adresse IP de la structure de la chaussette.

Je crois que c'est un moyen d'obtenir l'IP de la structure de la chaussette après que le serveur ait accepté la demande du client. Plus précisément dans c après l'exécution du serveur

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

Merci

34
REALFREE

OK en supposant que vous utilisez IPV4, procédez comme suit:

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

Si vous souhaitez ensuite l'adresse IP en tant que chaîne, procédez comme suit:

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

IPV6 est aussi assez facile ...

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

et obtenir une chaîne est presque identique à IPV4

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

La manière la plus simple et correcte d'extraire l'adresse IP et le numéro de port serait:

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

La réponse acceptée du SoapBox ne sera pas correcte pour toutes les architectures. Voir Big et Little Endian .

35
Misha

En supposant client_addr est un struct sockaddr_in (ce qui est généralement le cas). Vous pouvez obtenir l'adresse IP (sous la forme d'un entier non signé 32 bits) à partir de client_addr.sin_addr.s_addr.

Vous pouvez le convertir en chaîne de cette façon:

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