【问题标题】:What's the practical difference between the headers <linux/in.h> and <netinet/in.h>?标头 <linux/in.h> 和 <netinet/in.h> 之间的实际区别是什么?
【发布时间】:2012-02-22 03:15:10
【问题描述】:

据我观察,这两个库都包含超过 90% 的完全相同的代码。 当我在示例程序中声明它们时,不会发生任何奇迹。 即使它们位于单独的目录中,我也不太了解这些库的区别。有人可以帮我分解一下吗?

加: 我尝试在 sys/socket.h 之上声明 linux/in.h,编译器嗡嗡作响“找不到 sa_family_t 的指定限定列表”,这意味着 sa_family_t 未定义在 linux/in.h 的范围内,如果调用这种方式……

然后我对 netinet/in.h 尝试了同样的事情,好吧,不管声明在哪里,它都可以工作。

【问题讨论】:

    标签: c linux unix networking posix


    【解决方案1】:

    linux/*.h 标头实际上是供内部内核使用的,如果现在创建 Linux,这些文件甚至不会存在于 /usr/include 下。但在早期,很多用户空间 libc(当时的 libc4 和 libc5)都依赖 Linux 头文件来定义用于用户空间的类型、常量、结构等,因此 netinet/in.h 仅包含 #include &lt;linux/in.h&gt; 或类似内容,并且可爱的传统开始了。今天,linux 树中唯一应该用于用户空间应用程序的标头是一些与在低级别支持特定硬件相关的东西,例如 Linux 控制台、帧缓冲区、video4linux 等。

    简而言之,您应该使用netinet/in.h(POSIX 指定的标准标头)并假装您从未见过linux/in.h。 :-)

    【讨论】:

    • 在分解方面,我非常感谢这个
    【解决方案2】:

    来自 linux/in.h> 的标题:

    * Authors:     Original taken from the GNU Project <netinet/in.h> file.
    *              Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
    

    它适用于进行网络连接的内核代码。在您自己的代码中使用

    【讨论】:

    • 是否仍然可以在用户空间代码中使用 linux/in.h?我发誓我以前见过……
    • @DhaivatPandya 我很想看到这个有趣的案例
    • 我认为它是在一些服务器代码中只在 linux 上运行的一些研究项目......
    • 通常不建议这样做,因为标头结构可以不同。
    【解决方案3】:

    他们做的事情几乎一样,但是,一个是相当标准的,另一个不是。

    netinet 存在于许多 BSD *nixes 中,甚至在 BSD 之前的 *nixes 中都存在,因此,linux 选择为 netinet 提供非常相似的接口,以便可以移植代码。

    【讨论】:

      猜你喜欢
      • 2018-03-11
      • 2020-09-11
      • 2014-02-18
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2021-06-12
      相关资源
      最近更新 更多