【问题标题】:C++ Linux getpeername IP familyC++ Linux getpeername IP 系列
【发布时间】:2011-06-06 00:25:57
【问题描述】:

在我的 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;
}

我该如何解决?

谢谢1

【问题讨论】:

  • 注意struct socklen_t是错误的,应该是socklen_t

标签: c++ linux ip system-calls


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以使用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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      相关资源
      最近更新 更多