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

jas*_*kim 10 c unix linux networking posix

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

另外:我尝试在sys/socket.h上面声明linux/in.h,编译器嗡嗡作响,"找不到sa_family_t的指定限定列表",这意味着sa_family_t没有在linux/in.h的范围内定义,如果以这种方式打电话......

然后我为netinet/in.h尝试了同样的事情,好吧,无论声明在哪里,它都能正常工作.

R..*_*R.. 14

linux/*.h头真的意味着内部内核使用,如果今天的Linux正在创建中,这些文件甚至没有下存在/usr/include.但是在早期,很多用户空间libc(当时的libc4和libc5)依赖Linux头来定义用户空间中使用的类型,常量,结构等,所以netinet/in.h包含的内容正好#include <linux/in.h>或类似,并且可爱的传统开始了.今天linux,应该用于用户空间应用程序的树中唯一的标题是与支持低级别的特定硬件相关的一些事情,例如Linux控制台,帧缓冲区,video4linux等.

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