如何在C中将IP4和IP6地址转换为长值?

时间:2012-02-17 22:47:45

标签: c sockets ip ip-address

我需要一个兼容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获得了很长时间,但我很确定这是不正确的。关于如何解决这个问题的任何指示都非常感谢!

1 个答案:

答案 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,则bufin_addruint32_t

uint32_t u;
memcpy(&u, buf, sizeof(u));

如果地址是IPv6转换为 long 实际上没有意义。你需要128位宽的东西或者你自己的东西。最后一点不是那么容易,所以问问自己:你确定你需要吗?