为什么 sockaddr_in 中需要零填充?

2024-01-10

我用谷歌搜索了一下,有些人说“与 struct sockaddr 保持相同的大小”。但内核不会直接使用 sockaddr(对吗?)。使用时。内核会将其恢复到原来的样子。那么为什么需要零填充呢?

struct sockaddr {
    unsigned short    sa_family;    // address family, AF_xxx
    char              sa_data[14];  // 14 bytes of protocol address
};

struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET, AF_INET6
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};

struct in_addr {
    unsigned long s_addr;          // load with inet_pton()
};

我能找到的两条更相关的信息是

  • 将 sin_zero 设置为 0 http://silviocesare.wordpress.com/2007/10/22/setting-sin_zero-to-0-in-struct-sockaddr_in/

谈论一段代码not清除字节

这是一个错误。我看到这种情况偶尔发生。此错误可能会导致应用程序中出现未定义的行为。

接下来是一些解释

大多数网络代码不使用sockaddr_in,而是使用sockaddr。当您使用像 sendto 这样的函数时,您必须显式地将 sockaddr_in 或您正在使用的任何地址转换为 sockaddr。 sockaddr_in 与 sockaddr 的大小相同,但由于轻微的 hack,内部大小是相同的。

这个黑客就是 sin_zero。实际上,sockaddr_in 中有用数据的长度比 sockaddr 短。但差异是在 sockaddr_in 中使用一个小缓冲区填充的;该缓冲区是 sin_zero。

最后,可以在各个地方找到的信息

在某些架构上,不清除 sin_zero 不会导致任何问题。但在其他架构上可能会这样。规范要求清除 sin_zero,因此如果您希望代码现在和将来都没有错误,则必须执行此操作。

  • sin_zero的使用 http://lists.kernelnewbies.org/pipermail/kernelnewbies/2011-February/000966.html

回答问题

为什么我们需要这个 8 字节填充?

和答案

Unix 网络编程第 3.2 章说:“POSIX 规范 结构体中只需要三个成员:sin_family、sin_addr 和 罪恶端口。符合 POSIX 标准的实现定义 额外的结构成员,这对于互联网套接字地址来说是正常的 结构。几乎所有实现都添加了 sin_zero 成员,以便所有套接字 地址结构的大小至少为 16 个字节。 ”

它有点像结构填充,可能是为额外字段保留的 未来。就像评论的那样,你永远不会使用它。

这与第一个链接一致。清除字节告诉接收者“我们这边没有使用这些字节”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 sockaddr_in 中需要零填充? 的相关文章

随机推荐

  • 在 gdb 中显示参数包的值[重复]

    这个问题在这里已经有答案了 如何查看 gdb 中可变参数函数中参数包的值 示例代码 VariadicDebug cpp template
  • R 插入符号 createFolds 与 createMultiFolds 差异

    我创建折叠以进行交叉验证caret 我发现 createFolds 和 createMultiFolds 函数之间存在差异 在我看来 createFolds 是没有替换的 根据我的理解 这是正确的版本 createMultiFolds 有两
  • 什么时候使用 libmysql-6.1.dll 和 libmysql.dll?

    我正在使用 HeidiSQL 编辑 MYSQL 数据库 它询问我要使用哪个库进行编辑 libmysql 6 1 dll libmysql dll 我怎么知道该使用哪一个 这些替代品libmysql dll and libmariadb dl
  • 使用 Visual Studio 2010 打开 Visual Studio 2013 项目

    我需要使用 Visual studio 2010 打开 Visual studio 2013 项目 可以吗 谢谢 我尝试过 但它会产生兼容性错误 我的项目是MVC4解决方案 非常感谢你的回答 首先 您必须下载并安装 Visual Studi
  • Python:用于元组的 Pandas DataFrame

    这是为元组创建 DataFrame 的正确方法吗 假设元组是在代码片段内创建的 import pandas as pd import numpy as np import random row a b c col A B C D use n
  • 在 C# 中处理文件时确定缓冲区大小? [复制]

    这个问题在这里已经有答案了 我有一个简单的代码 它将文本文件合并为一个文本文件 void Main const int chunkSize 2 1024 2KB var inputFiles new c 1 txt c 2 txt c 3
  • 从一个组合框中选定的项目如何更改第二个组合框中的特定项目?

    Combobox1 有 3 个项目 西班牙 法国 英国 Combobox2 有 6 个项目 巴塞罗那 马德里 巴黎 马赛 伦敦 布里斯托尔 当从 Combobox1 西班牙 中选择一个项目时 它应该可用于 Combobox2 的特定项目 巴
  • 如何设置 HTTP 标头(用于缓存控制)?

    如何为我的网站启用浏览器缓存 我是否只是将cache control public 像这样放在我的标头中 我正在使用最新版本的 PHP 在最新版本的 XAMPP 上进行开发 要在 HTML 中使用缓存控制 您可以使用meta tag htt
  • 如何使用asp.net从文件夹中删除特定文件

    这是我的交易 我得到了一个名为 gridview1 的 datagridviewer 和一个 fileupload1 当我上传文件时 它会使用文件名和路径更新数据库中的 gridview1 和表 并将所述文件存储在文件夹 Mag 中 但现在
  • Bootstrap-Angular-ui 加载时模态

    我在用Bootstrap Angular UI 模态 http angular ui github io bootstrap modal对于我正在开发的网站 我用来打开模式的代码 modal open templateUrl home te
  • 缺少调试|项目的任何 CPU 构建配置,并在 Windows x64 上默认为调试|x86

    我最近刚刚在我的机器上重新安装了 Windows 7 x64 安装成功 整个操作系统没有出现任何问题 我认为 Windows 或 NET x64 存在配置问题 Symptoms 新项目的默认构建配置是调试 x86 这感觉不对 我正在运行 x
  • 测试 Google 应用内时退款测试购买

    我退款时遇到麻烦 当我登录发布商控制台时 它会显示我的购买和 取消整个订单 按钮 退款 按钮呈灰色 付款是使用测试帐户完成的 该应用程序尚未发布 我如何才能拿回我的钱 即使我通过测试帐户退款 Google 仍会向我收取 30 的费用吗 您必
  • 在MySql中使用空间函数查找两个坐标之间的距离的正确方法

    我正在尝试使用 Mysql 和 PostgresSQL 中的空间函数来计算两个位置之间的距离 我从谷歌获取了纬度和经度 详情如下 位置一 纬度 42 260223 经度 71 800010 位置二 纬度 42 245647 经度 71 80
  • 在 PyTorch 中加速 SVD

    我正在使用 Pytorch 为 CIFAR10 执行一些分类任务 对于每次迭代 我都必须对每个批次进行一些预处理 然后才能将其反馈给模型 以下是每个批次的预处理部分的代码 S torch zeros batch size C H W for
  • Python 定义迭代器类失败,并显示“iter() 返回了‘Fib’类型的非迭代器”

    我正在使用 python 2 7 和 ipython2 7 在 ipython 中我尝试过 class Fib object def init self max super Fib self init self max max def it
  • 在 Magento 中获取基本产品图像

    我想要得到baseMagento 中的产品图像可调整其大小并显示在购物车侧边栏中 不幸的是 echo this gt helper catalog image gt init product image gt resize 38 38 打印
  • MSIE 9 中的“GET”ting AngularJS 资源返回空数组

    Problem 当使用GET来自一个的请求 resource 仅在 Microsoft Internet Explorer 9 中 成功的响应是空数组 Tests 成功场景 使用 FF 或 Chrome GET请求返回开发环境和本地环境中的
  • 包装应用

    我们有一个 Windows 应用程序 我们使用 Wise 进行部署 最近我们改用InstallAware 虽然它有一些优点 但我们面临一些问题 有人可以推荐另一个部署和打包应用程序吗 我们是一家小公司 没有专门的人员进行打包等工作 我们的软
  • kubernetes 秘密在环境变量中有尾随空格

    我在 GKE 上运行的 Kubernetes 1 9 中创建了一个部署 该部署利用了放入环境变量中的机密 我使用 yaml 文件将机密上传到 GKE 其中机密经过 Base64 编码 我在容器中看到的是环境变量在那里 但值包含尾随空格 如果
  • 为什么 sockaddr_in 中需要零填充?

    我用谷歌搜索了一下 有些人说 与 struct sockaddr 保持相同的大小 但内核不会直接使用 sockaddr 对吗 使用时 内核会将其恢复到原来的样子 那么为什么需要零填充呢 struct sockaddr unsigned sh