我正在尝试编写一个处理IPV6和IPV4地址的IP地址类;为了达到这个目的,我正在使用sockadrr_storage数据结构。 我已经编写了这个类的大部分内容但是现在我在创建一个以正确和巧妙的方式使用getaddrinfo()函数的接口时遇到了一些困难。 我的意思是我想创建一个构造函数,它可以在放入一组参数后在sockadrr_storage数据结构中提供和插入正确的IP地址。 一些例子:
为此,此函数必须使用正确的参数调用getaddrrinfo()。 我必须处理这些案件:
这里有我迄今为止编写的代码。
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);
时,它会提供分段错误。
您认为此代码有什么问题吗?
然后我有一个更通用的问题:这可能是一个聪明的解决方案来处理这个问题吗?如果您有任何建议,请告诉我。
非常感谢。