2011-01-09 6 views
2

私のLinux C++アプリケーションでは、ピアIPを取得するためにgetpeernameを使用しています。 私の問題は:私は私のマシンでIPv6を有効にすると、私はそれがIPv4であるにもかかわらず、私がピアから得たIPがファミリIF_INET6であることです。C++ Linux getpeername IPファミリ

コード:

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; 
} 

私はそれを修正することができますか?

thanks1

+1

'struct socklen_t'が間違っていることに注意してください。ちょうど' socklen_t'でなければなりません。 – user562374

答えて

0

あなたはIPv4とIPv6アドレスの両方を扱うことができるinet_ntop()機能、使用することができます:あなたはすべてのアドレスの種類を扱うことができ、getnameinfoを使用し、inet_ntopに比べて短いことができ

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

char host[256]; 
getnameinfo(&ss, salen, host, sizeof(host), NULL, 0, 0); 
関連する問題