据我所知,两个库都包含超过90%的相同精确代码。 当我在我的示例程序中声明它们时,没有任何魔法发生。 我真的不明白这些库的区别,即使它们位于分开的目录中。有人可以为我分解吗?
加: 我尝试在sys / socket.h上面声明linux / in.h,编译器嗡嗡作响,“找不到sa_family_t的指定限定列表”,这意味着sa_family_t没有在linux / in.h的范围内定义,如果调用这种方式......
然后我为netinet / in.h做了同样的事情,好吧,无论声明在哪里,它都能正常工作。
答案 0 :(得分:13)
linux/*.h
标头实际上是用于内部内核使用的,如果今天创建Linux,这些文件甚至不会存在于/usr/include
下。但是在早期,很多用户空间libc(当时的libc4和libc5)依赖Linux头来定义用户空间中使用的类型,常量,结构等,因此netinet/in.h
只包含#include <linux/in.h>
或类似的,可爱的传统开始了。今天linux
树中唯一应该用于用户空间应用程序的标题是与支持低级别特定硬件相关的一些内容,如Linux控制台,帧缓冲区,视频4linux等。
简而言之,您应该使用netinet/in.h
(POSIX指定的标准标头)并假装您从未见过linux/in.h
。 : - )
答案 1 :(得分:1)
来自&lt; linux/in.h&gt;的标头:
* Authors: Original taken from the GNU Project <netinet/in.h> file.
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
它适用于进行网络连接的内核代码。使用&lt; netinet / in.h&gt;在你自己的代码中。
答案 2 :(得分:0)
他们几乎做同样的事情,但是,一个是相当标准的,另一个则不是。
netinet存在于许多BSD * nix中,并且甚至在BSD之前都是* nixes,因此,linux选择具有非常类似于netinet的接口,因此可以移植代码。