c - 标题 <linux/in.h> 和 <netinet/in.h> 之间的实际区别是什么?

标签 c linux unix networking posix

据我观察,这两个库都包含超过 90% 完全相同的代码。 当我在我的示例程序中声明它们时,没有魔法发生。 我真的不明白这些库的区别,即使它们位于单独的目录中。有人可以为我分解吗?

加上: 我尝试在 sys/socket.h 之上声明 linux/in.h,编译器发出类似“找不到 sa_family_t 的指定合格列表”的嗡嗡声,这意味着 sa_family_t 没有在 linux/in.h 的范围内定义,如果在这样……

然后我对 netinet/in.h 尝试了同样的事情,好吧,无论声明在哪里,它都有效。

最佳答案

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

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

关于c - 标题 <linux/in.h> 和 <netinet/in.h> 之间的实际区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9388611/

相关文章:

c - 程序在执行时终止

linux - 如何在不使用 crontab 的情况下在后台连续运行 unix 脚本。

linux - 通过 ssh 正确显示国际电子邮件字符

go - 将文件分成几个 block

c - 为什么 gcc 使用 -O0 进行一些优化

c - C中使用多线程的快速排序中的并行排序

linux - 更改 SSH session 上的主机名

unix - 执行程序和终止程序时的信号和中断

c - fprintf 未写入文件

linux - 如何查找不同组和用户拥有的所有服务/应用程序