lancer sockaddr_storage en tant que sockaddr_in pour inet_ntop

J’essaie de convertir un sockaddr_storage en sockadd_in afin de pouvoir imprimer l’adresse IP source d’un paquet de datagramme.

struct sockaddr_storage peer_addr; getnameinfo((struct sockaddr *) &peer_add peer_addrlen, hostbuff, sizeof(hostbuff), NULL, 0, NI_NAMEREQD); inet_ntop(AF_INET, (((struct sockaddr_in *)peer_addr).sin_addr), ipbuff, INET_ADDRSTRLEN); 

Lorsque j’essaie de convertir la structure en sockaddr_in, j’obtiens soit ‘ne peux pas convertir en pointeur’, soit lorsque je supprime le dereferance, j’obtiens une ‘conversion en type non scaler demandé’.

J’ai essayé beaucoup de combinaisons et je ne comprends tout simplement pas où je me trompe.

 inet_ntop(peer_addr->ss_family, &(((struct sockaddr_in *)peer_addr)->sin_addr), ipbuff, INET_ADDRSTRLEN); 

devrait marcher. Mais envisagez d’utiliser getnameinfo() place, qui est l’interface la plus moderne:

 char host[NI_MAXHOST]; getnameinfo((struct sockaddr *)peer_addr, peer_addr->ss_len, host, sizeof(host), NULL, 0, NI_NUMERICHOST); 

fonctionne pour les adresses IPv4 et IPv6.


Mettez à jour en fonction des types modifiés dans la question: Ceci est un exemple complet qui doit être compilé sans avertissements:

 int socket = ...; struct sockaddr_storage peer_addr; socklen_t peer_addrlen; char host[NI_MAXHOST]; ssize_t amount; char buffer[1000]; amount = recvfrom(socket, buffer, sizeof(buffer), 0, (struct sockaddr *)&peer_addr, &peer_addrlen); getnameinfo((struct sockaddr *)&peer_addr, peer_addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST); 

Ou, en utilisant inet_ntop() :

 char ipbuff[INET_ADDRSTRLEN]; inet_ntop(peer_addr.ss_family, &(((struct sockaddr_in *)&peer_addr)->sin_addr), ipbuff, INET_ADDRSTRLEN); 
 struct sockaddr_storage * peer_addr; getnameinfo((struct sockaddr *) &peer_add peer_addrlen, hostbuff, sizeof(hostbuff), NULL, 0, NI_NAMEREQD); 

Ici, vous mélangez des choses.

getnameinfo() prend en effet une struct sockaddr* comme premier paramètre, mais ce que vous essayez de faire ici ne fonctionnera pas: peer_addr est une struct sockaddr_storage * , vous prenez son adresse – qui est une struct sockaddr_storage ** , et essayez de lancer ce. Ça ne marchera pas.

Je ne sais pas d’où vient votre peer_addr , mais

  • soit ce devrait être un struct sockaddr_storage (je ne pense pas qu’il soit nécessaire d’avoir un pointeur sur un struct sockaddr_storage quelque part)
  • ou bien c’est vraiment un pointeur, et vous devriez passer (struct sockaddr *) peer_addr – sans le & – to getnameinfo() .

Autre point: le deuxième paramètre de getnameinfo() est censé être la taille “réelle” de la structure d’adresse que vous entrez.