2011-01-09 60 views
2

在我的Linux C++应用程序中,我使用getpeername来获取对等IP。 我的问题是:当我在我的机器上启用IPv6时,我从对等机构获得的IP与家庭IF_INET6虽然是IPv4。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 2011-01-09 10:52:38

回答

0

可以使用inet_ntop()功能,可以同时处理IPv4和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

您可以使用getnameinfo,它可以处理所有的地址类型,以及短于inet_ntop到使用:

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