首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么linux的IPv4地址是16字节而不是4字节

为什么linux的IPv4地址是16字节而不是4字节
EN

Stack Overflow用户
提问于 2015-07-10 14:51:01
回答 1查看 327关注 0票数 2

我正在尝试将域名解析为ipv4地址。

下面是我正在做的事情的最起码的代码

代码语言:javascript
运行
复制
addrinfo hints, *results;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
int error = getaddrinfo("google.com", 0, &hints, &results);
for(addrinfo* info = results; info; info = info->ai_next)
{
    std::cout << (info->ai_family == AF_INET6 ? "ip6" : "ip4")
              << '[' << info->ai_addrlen << "]: ";
    for(uint i = 0; i < info->ai_addrlen; ++i)
        std::cout << int(((uint8_t*)info->ai_addr)[i]) << ' ';
    std::cout << std::endl;
}
freeaddrinfo(results);

当我运行这个时,它会打印:

代码语言:javascript
运行
复制
ip4[16]: 2 0 0 0 216 58 208 238 0 0 0 0 0 0 0 0 
ip4[16]: 2 0 0 0 216 58 208 238 0 0 0 0 0 0 0 0 
ip4[16]: 2 0 0 0 216 58 208 238 0 0 0 0 0 0 0 0

google.com的实际ip是216.58.208.238。因此,出于某种原因,对于ip v4,ai_addr包含16个字节,并且实际上将地址存储在字节4到8之间。

我的问题是:,其他12个字节是什么?

我读过医生们,在谷歌上搜索了一下,但在addr_len上什么也没找到。还请注意,我没有设置AI_V4MAPPED标志。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-10 15:06:49

我不确定这是否是某些标准所要求的,但是struct sockaddr被定义为包含地址家族的short,然后包含特定于地址家族的14字节数据。

作为地址的每一种类型都必须与此兼容,因此,至少要有相同的长度。

对于struct sockaddr_in ( IPv4),如下所示:

代码语言:javascript
运行
复制
struct sockaddr_in {
    short            sin_family;
    unsigned short   sin_port;
    struct in_addr   sin_addr;
    char             sin_zero[8];
};

地址系列为2字节,端口为2字节,IPv4地址为4字节,填充为8字节以达到struct sockaddr的长度。

尽管如此:您的问题略有错误,这不是一个IPv4地址(即struct in_addr,实际上只有4个字节),而是IPv4的一个套接字地址。尽管如此,这里仍有8个字节被“浪费”。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31343855

复制
相关文章

相似问题

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