【问题标题】:Do we need to include both <netinet/in.h> and <arpa/inet.h> headers? What is the difference between them?我们是否需要同时包含 <netinet/in.h> 和 <arpa/inet.h> 标头?它们之间有什么区别?
【发布时间】:2018-03-11 19:17:39
【问题描述】:

不是让另一个可见吗?它们之间有什么区别以及何时使用什么?我的教授为我提供了一个入门代码,他在服务器套接字中使用了&lt;netinet/in.h&gt;,在客户端使用了&lt;arpa/inet.h&gt;。有什么原因吗?

【问题讨论】:

  • 正如我今天发现的,仅包括netinet/ip.h 将不允许您使用inet_addr() 功能,这需要&lt;arpa/inet.h&gt; 所以有一个原因。这个解释,我不能说

标签: sockets network-programming


【解决方案1】:

这是 C 库中的常见模式:头文件 A 定义了一些东西,头文件 B 定义了一些东西,但是头文件 A 需要头文件 B 中的一些东西,所以它自己包含 B。

因此,如果您仅包含标头 A,即使您使用标头 B 中的内容,您的代码仍然可以编译。arpa/inet.h 似乎就是这种情况,包括 netinet/in.h。所以不,你“不需要”同时包含两者。

但是

尽管包含 A 可能包含 B 作为副作用,但这实际上只是一个实现细节,可能不是标题保证的内容。换句话说,您的代码可能在您的机器上编译得很好,但在另一台标头实现略有不同的符合标准的机器上编译失败。

另一种可能会让您感到困扰的情况是代码重构。沿着这条线,您可能会以某种方式重组您的代码不再调用inet_addr 或来自arpa/inet.h 的任何其他内容。 “哦,我现在可以删除那个标题了!”你可能会想……只是为了让你的代码停止编译,因为你还在某处使用sockaddr_in,而且你从未直接包含netinet/in.h

(您需要阅读文档以了解标准保证提供的标头:arpa/inet.hnetinet/in.h

或者也许一些可怜的新手在多年后正在查看您的代码以获得指导。他们对这种网络魔法一无所知,看到INADDR_BROADCASTsa_family_t,他们非常困惑。因为这些符号被定义为 arpa/inet.h! 的特定于实现的副作用!

所以,同样,您“不需要”同时包含两者。但无论如何,这样做是个好主意。

【讨论】:

    【解决方案2】:

    它们是不同的标题。如果您需要两者的定义,请同时包含两者。

    它们的内容记录在 Posix 中:

    netinet/in.h 允许包含所有arpa/inet.h,反之亦然。但它不能保证,你不应该依赖它。如文档所述,一些(但不是全部)符号都需要在两者中声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-10
      • 2014-11-10
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      相关资源
      最近更新 更多