c++ - 为什么 linux 的 IPv4 地址占用 16 个字节而不是 4 个

标签 c++ linux dns ip

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

这是我正在做的最简单的代码

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);

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

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 个字节是什么?

我读了the docs , 并用谷歌搜索了一下,但在 addr_len 上什么也没找到。另请注意,我没有设置 AI_V4MAPPED 标志。

最佳答案

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

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

对于 struct sockaddr_in(IPv4 的那个),它看起来像这样:

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 个字节在这里“浪费”了。

关于c++ - 为什么 linux 的 IPv4 地址占用 16 个字节而不是 4 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31343855/

相关文章:

c++ - QT和QGLViewer程序中如何改变QGLViewer默认的远近裁剪距离?

c++在 bool 模式下搜索文本

linux - 如何将管道的grep结果写入文件

dns - 如果网站服务器关闭,显示特殊页面。没有 nginx 代理有没有办法做到这一点?

google-cloud-platform - 如何使用 Terraform 在 GCP 中添加 DNS 记录?

node.js - Node : Set different domain name on different port

c++ - 如果包含析构函数,类的大小会增加

c++ - LNK1104 无法打开文件 'legacy_stdio_definitions.lib'

linux - 为什么我的 root 用户与使用相同 shell 的其他用户有不同的 shell 提示?

c - 正确发送 RST 数据包到 TCP 客户端和服务器作为网关