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

时间:2010-03-30 23:43:54

标签: python c unix sockets

查看有关套接字编程的示例,我们可以看到有些人使用AF_INET而其他人使用PF_INET。此外,有时候both of them are used at the same example。问题是:它们之间有什么区别吗?我们应该使用哪一个?

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


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

socket联页>

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

int socket(int domain, int type, int protocol);

该联机帮助页说:

  

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

的Python

Python socket module与C API非常相似。但是,有许多AF_常量但只有一个PF_常量(PF_PACKET)。因此,在Python中我们别无选择,只能使用AF_INET

我认为这个只包括AF_常数的决定遵循以下指导原则之一:“应该有一个 - 最好只有一个 - 明显的方法来做到这一点。” (The Zen of Python)

其他信息

This forum post指向this old message的链接,其中包含一些历史信息。

1 个答案:

答案 0 :(得分:23)

我认为Wikipedia notes on this总结得很好:

  

套接字接口的原始设计概念区分协议类型(系列)和每个可能使用的特定地址类型。设想协议族可能有几种地址类型。地址类型由其他符号常量定义,使用前缀AF_而不是PF_AF_ - 标识符适用于专门处理地址类型而非协议族的所有数据结构。但是,这种分离协议和地址类型的概念还没有找到实现支持,而AF_ - 常量只是由相应的协议标识符定义,从而区分AF_PF_常量技术论证没有重大的实际后果。实际上,正确使用这两种形式存在很多混淆。

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