在套接字编程中AF_INET和PF_INET的区别是什么?

在套接字编程中AF_INET和PF_INET的区别是什么?

我对在socket()bind()中使用AF_INET和PF_INET感到困惑。

另外,如何在sin_addr字段中给出ip-address ?

200289 次浏览
  • 地址族
  • 协议族

意思是,AF_INET指的是来自互联网的地址,特别是IP地址。PF_INET指的是协议中的任何东西,通常是socket /ports。

考虑阅读插座(2)(2)结合的手册页。对于sin_addr字段,只需执行如下操作来设置它:

struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);

Beej著名的网络编程指南给出了一个很好的解释:

在一些文档中,你会看到一个神秘的“PF_INET”。 这是一种奇怪的空中野兽在自然界中很少见,但我 不妨在这里澄清一下。很久以前是这样的 认为可能是一个地址族(“AF_INET”中的“AF”代表什么 For)可能支持由它们引用的多个协议 协议族(PF_INET中的PF所代表的意思) 但这并没有发生。哦。所以正确的做法是在你的 struct sockaddr_in和PF_INET在你调用socket()。但 实际上,你可以在任何地方使用AF_INET。而且,既然 这是w·理查德·史蒂文斯在他的书中所写的,这也是我要做的 这里。< / p >
我在Linux内核源代码中发现PF_INET和AF_INET是相同的。 下面的代码来自于Linux内核3.2.21树的包括/ linux / socket.h文件,第204行
/* Protocol families, same as address families. */
...
#define PF_INET     AF_INET

事实上,AF_和PF_是一样的。维基百科上有一些词可以帮你理清思路

套接字接口的原始设计概念区分了协议类型(族)和每种协议可能使用的特定地址类型。协议族可以有几种地址类型。地址类型由额外的符号常量定义,使用前缀AF_而不是PF_。af_identifier用于所有专门处理地址类型的数据结构,而不是协议族。然而,协议和地址类型分离的概念还没有得到实现支持,而AF_常量只是由相应的协议标识符定义的,这使得AF_常量与PF_常量之间的区别成为一个没有重大实际后果的技术争论。事实上,这两种形式的正确使用存在很多混乱。

在某些情况下,这很重要。

如果你在Cygwin中将AF_INET传递给socket(),你的套接字可能会被随机重置,也可能不会。传递PF_INET确保连接正常工作。

Cygwin对套接字编程来说是一个巨大的混乱,但是它了一个AF_INET和PF_INET不相同的真实情况。

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指的是协议中的任何东西,通常是套接字/端口。

检查头文件解决了这个问题。 可以检查系统编译器。

对于我的系统,AF_INET == PF_INET

AF =地址族,PF =协议族

协议族,与地址族相同。

enter image description here