我们是否需要同时包含 <netinet/in.h> 和 <arpa/inet.h> 标头?它们之间有什么区别?

Man*_*nic 5 sockets network-programming

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

Max*_*Max 6

这是 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!

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