我们是否需要包含<netinet in.h =“”>和<arpa inet.h =“”>标题?他们之间有什么区别?

时间:2017-09-29 20:16:34

标签: sockets network-programming

不能让另一个看得见吗?他们和什么时候使用什么有什么区别?我的教授为我提供了一个入门代码,他在服务器套接字中使用<netinet/in.h>,在客户端使用<arpa/inet.h>。这有什么理由吗?

2 个答案:

答案 0 :(得分:2)

这是C库中的常见模式:标题A定义了一些内容,标题B定义了一些内容,但标题A 需要标题B中的一些内容,因此它自己包含B.

因此,如果您只包含标题A,即使您使用标题B中的内容,您的代码仍会进行编译。arpa/inet.h包括netinet/in.h就是这种情况。所以不,你不“需要”包括两者。

<强> BUT

即使包含A可能包含B作为副作用,这实际上只是一个实现细节,并且可能不是标题保证的内容。换句话说,您的代码可能在您的机器上编译良好,但无法在另一个符合标准的机器上进行编译,而且头部实现略有不同。

另一种可以咬你的情况是代码重构。在某种程度上,您可能会以某种方式重新构建代码,使您的代码不再调用inet_addrarpa/inet.h中的任何其他内容。 “哦,我现在可以删除那个标题!”你可能会认为...只是因为你的代码停止编译,因为你仍然在某处使用sockaddr_in并且你从未直接包含netinet/in.h

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

或者也许一些可怜的新手在几年后看你的代码寻求指导。他们对这种网络魔术一无所知,他们看到INADDR_BROADCASTsa_family_t,他们很困惑。因为这些符号被定义为arpa/inet.h

的特定于实现的副作用

所以,再一次,你并不“需要”包括两者。但无论如何这样做是个好主意。

答案 1 :(得分:0)

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

他们的内容记录在Posix中:

允许

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