C ++ Linux getpeername IP系列

时间:2011-01-09 08:34:05

标签: c++ linux ip system-calls

在我的Linux C ++应用程序中,我使用getpeername来获取对等IP。 我的问题是:当我在我的机器上启用IPv6时,我从对等端获得的IP是家庭IF_INET6,尽管它是IPv4。

代码:

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

2 个答案:

答案 0 :(得分:1)

您可以使用getnameinfo,它可以处理所有地址类型,并且使用的时间比inet_ntop短:

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

答案 1 :(得分: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;
}