看一下关于套接字编程的例子,我们可以看到有些人在使用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_*.
在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的禅宗)