关于getaddrinfo()的犹豫是否正确用于处理IPV4和IPV6

时间:2014-11-05 18:41:53

标签: c++ network-programming ipv6 ipv4

我正在尝试编写一个处理IPV6和IPV4地址的IP地址类;为了达到这个目的,我正在使用sockadrr_storage数据结构。 我已经编写了这个类的大部分内容但是现在我在创建一个以正确和巧妙的方式使用getaddrinfo()函数的接口时遇到了一些困难。 我的意思是我想创建一个构造函数,它可以在放入一组参数后在sockadrr_storage数据结构中提供和插入正确的IP地址。 一些例子:

  • ip_address ip_v4(“127.0.0.1”); - >这将给出一个环回地址
  • ip_address ip_v6(“::”,0,AF_INET6,SOCK_STREAM); - >这将提供本地的V6链接
  • ip_address host_adr(“www.google.it”); - >这将执行dns查找

为此,此函数必须使用正确的参数调用getaddrrinfo()。 我必须处理这些案件:

  • 环回V4和V6
  • 通配符V4和V6
  • 数字字符串V4和V6
  • 主机名字符串V4和V6

这里有我迄今为止编写的代码。

bool ip_address::parse_addr(std::string addr_ , std::string port_ , int ai_family , int ai_socktype)
{

  struct addrinfo hints , * host_info ;
  memset(&hints , 0, sizeof(struct addrinfo));

  switch(ai_family)
  {
    case AF_INET:
      hints.ai_family = AF_INET;
      hints.ai_socktype = ai_socktype;
      break;

    case AF_INET6:
      hints.ai_family = AF_INET6;
      hints.ai_socktype = ai_socktype;
      break;
  }

  getaddrinfo(addr_.c_str(), port_.c_str(), &hints, &host_info);

  if(host_info->ai_family == AF_INET )
  {
    struct sockaddr_in adr;
    memset(&adr,0,sizeof(struct sockaddr_in));
    adr.sin_family = AF_INET;
    size_ = sizeof(struct sockaddr_in);
    address_.ss_family = AF_INET;
    ((struct sockaddr_in *)&address_)->sin_addr = ((struct sockaddr_in *) host_info->ai_addr)->sin_addr;
  }
  else if(host_info->ai_family == AF_INET6 )
  {
    struct sockaddr_in6 adr;
    memset(&adr,0,sizeof(struct sockaddr_in6));
    adr.sin6_family = AF_INET6;
    size_ = sizeof(struct sockaddr_in6);
    address_.ss_family = AF_INET6;
    ((struct sockaddr_in6 *)&address_)->sin6_addr = ((struct sockaddr_in6 *) host_info->ai_addr)->sin6_addr;
  }

  freeaddrinfo(host_info);


return false;

parse_addr()是从 ip_address 类的构造函数调用的方法。

目前此代码仅适用于IPV4。事实上,当我向main()添加此调用ip_address ip_v6("::", 0 , AF_INET6 , SOCK_STREAM);时,它会提供分段错误

您认为此代码有什么问题吗?

然后我有一个更通用的问题:这可能是一个聪明的解决方案来处理这个问题吗?如果您有任何建议,请告诉我。

非常感谢。

0 个答案:

没有答案