查看有关套接字编程的示例,我们可以看到有些人使用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_ *。
sys/socket.h
实际上并未定义这些常量,而是包含bits/socket.h
。这个文件定义了大约38个AF_
常量和38个PF_
常量,如下所示:
#define PF_INET 2 /* IP protocol family. */
#define AF_INET PF_INET
Python socket module与C API非常相似。但是,有许多AF_
常量但只有一个PF_
常量(PF_PACKET)。因此,在Python中我们别无选择,只能使用AF_INET
。
我认为这个只包括AF_
常数的决定遵循以下指导原则之一:“应该有一个 - 最好只有一个 - 明显的方法来做到这一点。” (The Zen of Python)
This forum post指向this old message的链接,其中包含一些历史信息。
答案 0 :(得分:23)
我认为Wikipedia notes on this总结得很好:
套接字接口的原始设计概念区分协议类型(系列)和每个可能使用的特定地址类型。设想协议族可能有几种地址类型。地址类型由其他符号常量定义,使用前缀
AF_
而不是PF_
。AF_
- 标识符适用于专门处理地址类型而非协议族的所有数据结构。但是,这种分离协议和地址类型的概念还没有找到实现支持,而AF_
- 常量只是由相应的协议标识符定义,从而区分AF_
与PF_
常量技术论证没有重大的实际后果。实际上,正确使用这两种形式存在很多混淆。
即使有人想出了今天有所不同的理由,他们也必须提出新的标识符,否则会破坏很多东西...