首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言中的IPv6解析

C语言中的IPv6解析
EN

Stack Overflow用户
提问于 2010-06-03 08:48:55
回答 7查看 33.5K关注 0票数 14

我想知道如何在C中解析IPv6地址并将其转换为128位的值?

因此,像1:22:333:aaaa:b:c:d:e这样的十六进制地址需要转换为其128位等效的二进制地址。问题是IP地址可能是::2类型及其变体,因为它们是有效的IPv6地址。

输入来自键盘,因此是ASCII格式。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-06-03 09:00:22

您可以使用POSIX inet_pton将字符串转换为struct in6_addr

代码语言:javascript
复制
#include <arpa/inet.h>

  ...

const char *ip6str = "::2";
struct in6_addr result;

if (inet_pton(AF_INET6, ip6str, &result) == 1) // success!
{
    //successfully parsed string into "result"
}
else
{
    //failed, perhaps not a valid representation of IPv6?
}
票数 15
EN

Stack Overflow用户

发布于 2010-06-03 08:55:11

getaddrinfo()可以理解IPv6地址。在提示中向其传递AF_INET6,以及AI_NUMERICHOST (以防止DNS查找)。Linux有它,Windows从Windows XP开始有它。

票数 10
EN

Stack Overflow用户

发布于 2017-07-11 19:39:15

你可以使用getaddrinfo()的POSIX函数。它比inet_pton()更灵活,例如,它可以自动检测IPv4和IPv6地址格式,甚至可以解析主机名(使用inet_pton()解析)和端口/服务名(使用/etc/services)。

代码语言:javascript
复制
#include <sys/types.h>
#include <netdb.h>
#include <netdb.h>

....

const char *ip6str = "::2";

struct sockaddr_storage result;
socklen_t result_len;

struct addrinfo *res = NULL;
struct addrinfo hints;
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_DEFAULT | AI_NUMERICHOST | AI_NUMERICSERV;

rc = getaddrinfo(ip6str, NULL, &hints, &res);
if (rc != 0)
{
    fprintf(stderr, "Failure to parse host '%s': %s (%d)", ip6str, gai_strerror(rc), rc);
    return -1;
}

if (res == NULL)
{
    // Failure to resolve 'ip6str'
    fprintf(stderr, "No host found for '%s'", ip6str);
    return -1;
}

// We use the first returned entry
result_len = res->ai_addrlen;
memcpy(&result, res->ai_addr, res->ai_addrlen);

freeaddrinfo(res);

IPv6地址存储在struct sockaddr_storage result变量中。

代码语言:javascript
复制
if (result.ss_family == AF_INET6) // Ensure that we deal with IPv6
{
    struct sockaddr_in6 * sa6 = (struct sockaddr_in6 *) &result;
    struct in6_addr * in6 = &sa6->sin6_addr;
    in6->s6_addr[0]; // This is a first byte of the IPv6
    in6->s6_addr[15]; // This is a last byte of the IPv6
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2962664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档