56 votes

Obtenir l'adresse IPV4 à partir d'une structure sockaddr

Comment puis-je extraire une adresse IP dans une chaîne? Je ne trouve pas de référence qui m'indique comment char sa_data[14] est codé.

65voto

Emil H Points 24062

Il suffit de transtyper la structure sockaddr entière dans un sockaddr_in . Ensuite, vous pouvez utiliser:

 char *ip = inet_ntoa(their_addr.sin_addr)
 

Pour récupérer la représentation IP standard.

33voto

John Points 1002

Emil réponse est bonne, mais c'est ma compréhension que inet_ntoa est déprécié et qu'à la place vous devez utiliser inet_ntop. Si vous utilisez IPv4, lancez votre struct sockaddr de sockaddr_in. Votre code devrait ressembler à quelque chose comme ceci:

struct addrinfo *res;   // populated elsewhere in your code
struct sockaddr_in *ipv4 = (struct sockaddr_in *)res->ai_addr;
char ipAddress[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(ipv4->sin_addr), ipAddress, INET_ADDRSTRLEN);

printf("The IP address is: %s\n", ipAddress);

Jetez un oeil à cette grande ressource pour plus d'explication, y compris comment faire pour les adresses IPv6.

26voto

Amber Points 159296

Cet article explique le contenu de la structure sockaddr:

http://h30097.www3.hp.com/docs/base%5Fdoc/DOCUMENTATION/V50A%5FHTML/MAN/MAN7/0052%5F%5F%5F%5F.HTM

Une fois lancé sur sockaddr_in, il devient ceci:

  struct sockaddr_in {
      u_short sin_family;
      u_short sin_port;
      struct in_addr sin_addr;
      char		 sin_zero[8];
       };
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X