2011-01-09 2 views
2

Dans mon application Linux C++, j'utilise getpeername pour obtenir l'adresse IP homologue. mon problème est: quand j'active l'IPv6 sur ma machine l'IP que j'ai reçu du pair est avec la famille IF_INET6 bien que ce soit IPv4.C++ Linux getpeername Famille IP

Code

:

int GetSockPeerIP(int sock) 
{ 
    struct sockaddr_storage ss; 
    struct socklen_t salen = sizeof(ss); 
    struct sockaddr *sa; 
    memset(&ss,0,salen); 
    sa = (sockaddr *)&ss; 

    if(getpeername(sock,sa,&salen) != 0) 
    { 
     return -1; 
    } 

    char * ip=NULL: 
    if(sa->sa_family == AF_INET) 
    { 
     ip = inet_ntoa((struct sockaddr_in *)sa)->sin_addr); 
    } 
    else 
    { 
     //ip = how to convert IPv6 to char IP? 
    } 

    return 0; 
} 

comment puis-je résoudre ce problème?

thanks1

+1

Notez que 'struct socklen_t' est faux, il devrait être juste' socklen_t'. – user562374

Répondre

0

Vous pouvez utiliser la fonction inet_ntop(), qui peut gérer à la fois des adresses IPv4 et IPv6:

char ip[INET6_ADDRSTRLEN]; 
switch(sa->sa_family) { 
    case AF_INET: 
     inet_ntop(AF_INET, ((struct sockaddr_in *) sa)->sin_addr, ip, salen); 
     break; 

    case AF_INET6: 
     inet_ntop(AF_INET6, ((struct sockaddr_in6 *) sa)->sin6_addr, ip, salen); 
     break; 

    default: 
     // Unknown address family. 
     return -1; 
} 
1

Vous pouvez utiliser getnameinfo, qui peut gérer tous les types d'adresses, et est plus courte que inet_ntop à utiliser:

char host[256]; 
getnameinfo(&ss, salen, host, sizeof(host), NULL, 0, 0); 
Questions connexes