套接字编程中AF_INET和PF_INET有什么区别?

SP *_*dhu 198 c sockets linux

套接字编程中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)

  • 据我所知,在所有版本的内核和 libc 中,PF_* == AF_* (2认同)
  • 我认为为了确保这一点,您需要检查包含的头文件:) (2认同)

小智 48

  • AF =地址族
  • PF =协议族

含义,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 == 协议族

协议族,与地址族相同。

在此处输入图片说明

  • `/usr/src/linux-headers-XXX-XX-generic/include/linux/socket.h` (2认同)