我需要一个兼容IP4和IP6地址的功能,我需要将地址从它的字符串表示(IP4)或十六进制表示(IP6)转换为它的长值。我目前的代码是:
struct addrinfo *addr;
// This converts an char* ip_address to an addrinfo, so now I know whether
// it's a IP4 or IP6 address
int result = getaddrinfo(ip_address, NULL, NULL, &addr);
if (result ==0) {
struct in_addr dst;
result = inet_pton(addr->ai_family, ip_address, &dst);
long ip_value = dst->s_addr;
freeaddrinfo(addr);
return ip_value;
}
我确实从dst-> s_addr获得了很长时间,但我很确定这是不正确的。关于如何解决这个问题的任何指示都非常感谢!
答案 0 :(得分:1)
首先,您的dst
不足以容纳IPv6
地址:
unsigned char buf[sizeof(struct in6_addr)]; /* Since it's larger than in_addr */
int result = getaddrinfo(ip_address, NULL, NULL, buf);
如果地址是IPv4,则buf
是in_addr
,uint32_t
。
uint32_t u;
memcpy(&u, buf, sizeof(u));
如果地址是IPv6转换为 long
实际上没有意义。你需要128
位宽的东西或者你自己的东西。最后一点不是那么容易,所以问问自己:你确定你需要吗?