套接字编程中AF_INET和PF_INET有什么区别?
我和在socket()和中使用AF_INET和PF_INET之间的困惑bind().
另外,如何在sin_addr现场提供ip-address ?
Dam*_*mon 239
Beej着名的网络编程指南给出了一个很好的解释:
在某些文档中,您会看到一个神秘的"PF_INET".这是一种奇怪的以太野兽,在自然界很少见,但我不妨在这里澄清一下.很久以前,人们认为可能是地址族("AF_INET"中的"AF"代表什么)可能支持其协议族所引用的几种协议("PF_INET"中的"PF"代表什么) ).
那没发生.那好吧.所以正确的做法是在你的struct sockaddr_in和PF_INET中使用AF_INET来调用socket().但实际上,你可以在任何地方使用AF_INET.而且,既然这就是理查德史蒂文斯在他的书中所做的那样,那就是我在这里要做的.
Duk*_*uke 65
我在Linux内核源代码中发现PF_INET和AF_INET是相同的.以下代码来自文件include/linux/socket.h,Linux内核3.2.21树的第204行.
/* Protocol families, same as address families. */
...
#define PF_INET AF_INET
Run Code Online (Sandbox Code Playgroud)
小智 48
含义,AF_INET指的是来自互联网的地址,具体是IP地址.PF_INET指协议中的任何内容,通常是套接字/端口.
考虑读取socket(2)和bind(2)的手册页.对于该sin_addr字段,只需执行以下操作即可进行设置:
struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
Run Code Online (Sandbox Code Playgroud)
fir*_*iro 11
事实上,AF_和PF_是一回事.维基百科上有一些词会清除你的困惑
套接字接口的原始设计概念区分协议类型(系列)和每个可能使用的特定地址类型.设想协议族可能有几种地址类型.地址类型由其他符号常量定义,使用前缀AF_而不是PF_.AF_标识符适用于专门处理地址类型而非协议族的所有数据结构.然而,这种协议和地址类型分离的概念尚未找到实现支持,并且AF_-常量仅由相应的协议标识符定义,使AF_与PF_常数之间的区别成为没有重大实际后果的技术论证.实际上,正确使用这两种形式存在很多混淆.
小智 6
AF_INET = 地址格式,Internet = IP 地址
PF_INET = 数据包格式,Internet = IP、TCP/IP 或 UDP/IP
AF_INET 是用于您正在创建的套接字的地址族(在本例中为 Internet 协议地址)。例如,Linux 内核支持 29 个其他地址系列,例如 UNIX 套接字和 IPX,以及与 IRDA 和蓝牙(AF_IRDA 和 AF_BLUETOOTH,但您是否会在如此低的级别使用这些)的通信。
在大多数情况下,坚持使用 AF_INET 进行网络套接字编程是最安全的选择。
意思是,AF_INET 是指来自互联网的地址,特别是 IP 地址。
PF_INET 指的是协议中的任何东西,通常是套接字/端口。
小智 5
检查头文件解决了问题。可以检查那里的系统编译器。
对于我的系统,AF_INET == PF_INET
AF == 地址族和 PF == 协议族
协议族,与地址族相同。
