C ++ Linux getpeername IP семейство - PullRequest
       6

C ++ Linux getpeername IP семейство

2 голосов
/ 09 января 2011

В моем приложении на 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 ]

1 голос
/ 09 января 2011

Вы можете использовать getnameinfo, который может обрабатывать все типы адресов, и короче inet_ntop для использования:

char host[256];
getnameinfo(&ss, salen, host, sizeof(host), NULL, 0, 0);
0 голосов
/ 09 января 2011

Вы можете использовать функцию 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;
}
...