AF_INET和PF_INET常量之间有什么区别?

Den*_*aia 30 c python unix sockets

看一下关于套接字编程的例子,我们可以看到有些人在使用AF_INET其他人时使用PF_INET.另外,有时它们都用在同一个例子中.问题是:它们之间有什么区别吗?我们应该使用哪一个?

如果你能回答这个问题,另一个问题就是......为什么有这两个相似(但相等)的常数?


到目前为止,我发现了什么:

socket手册页

在(Unix)套接字编程中,我们有socket()接收以下参数的函数:

int socket(int domain, int type, int protocol);
Run Code Online (Sandbox Code Playgroud)

该联机帮助页说:

所述domain参数指定的通信区域; 这将选择将用于通信的协议族.这些系列在<sys/socket.h>中定义.

并且该手册页引用了该参数AF_INET以及其他一些AF_常量domain.此外,在NOTES同一手册页的部分,我们可以阅读:

4.x BSD下用于协议族的清单常量是PF_UNIX,PF_INET等,而AF_UNIX等用于地址族.但是,BSD手册页已经承诺:"协议族通常与地址族相同",后续标准在任何地方都使用AF_*.

C标头

sys/socket.h实际没有定义这些常量,而是包括bits/socket.h.这个文件定义了大约38个AF_常量和38个PF_常量,如下所示:

#define PF_INET     2   /* IP protocol family.  */
#define AF_INET     PF_INET
Run Code Online (Sandbox Code Playgroud)

蟒蛇

Python的插座模块是非常相似的C API.但是,有许多AF_常量但只有一个PF_常量(PF_PACKET).因此,在Python中我们别无选择,只能使用AF_INET.

我认为这个仅包括AF_常数的决定遵循一个指导原则:"应该有一个 - 最好只有一个 - 明显的方法来做到这一点." (Python的禅宗)

其他信息

此论坛帖子链接到此旧邮件,其中包含一些历史信息.

Mic*_*urr 24

我认为维基百科对此的说明总结得很好:

套接字接口的原始设计概念区分协议类型(系列)和每个可能使用的特定地址类型.设想协议族可能有几种地址类型.地址类型由附加的符号常量定义,使用前缀AF_而不是PF_.该AF_-identifiers旨在为专门与地址类型,而不是协议系列处理所有的数据结构.然而,这种协议和地址类型分离的概念尚未找到实现支持,并且 - AF_常量仅由相应的协议标识符定义,使得AF_PF_常量之间的区别成为没有重大实际后果的技术论证.实际上,正确使用这两种形式存在很多混淆.

即使有人想出了今天有所不同的理由,他们也必须提出新的标识符,否则会破坏很多东西......

  • 简而言之,这是凡人的设计缺陷.我们必须忍受它. (2认同)