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_*.
在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_
常量之间的区别成为没有重大实际后果的技术论证.实际上,正确使用这两种形式存在很多混淆.
即使有人想出了今天有所不同的理由,他们也必须提出新的标识符,否则会破坏很多东西......
归档时间: |
|
查看次数: |
17070 次 |
最近记录: |