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

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

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

另外,如何在sin_addr字段中给ip地址?

Beej着名的networking编程指南给出了一个很好的解释:

在某些文档中,您会看到提及神秘的“PF_INET”。 这是一种自然界罕见的怪兽类兽,不过我不妨在这里澄清一下。 很久以前,有人认为可能是一个地址族(“AF_INET”中的“AF”)可能支持协议族引用的几个协议(“PF_INET”中的“PF”代表什么)。
那没有发生。 好吧。 所以正确的做法是在你的struct sockaddr_in和PF_INET中使用AF_INET来调用socket()。 但实际上,你可以在任何地方使用AF_INET。 而且,由于这就是W. Richard Stevens在他的书中所做的,那就是我在这里要做的。

我在Linux内核源代码中发现PF_​​INET和AF_INET是一样的。 以下代码来自Linux内核3.2.21树的include / linux / socket.h ,第204行。

 /* Protocol families, same as address families. */ ... #define PF_INET AF_INET 
  • AF =地址族
  • PF =协议族

意思是, AF_INET是指来自互联网的地址,具体是IP地址。 PF_INET是指协议中的任何东西,通常是套接字/端口。

考虑阅读套接字(2)和绑定(2)的手册页。 对于sin_addr字段,只需执行以下操作来设置它:

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

实际上,AF_和PF_是一回事。 维基百科上有一些单词会清除你的困惑

套接字接口的原始devise概念区分协议types(族)和每个可能使用的特定地址types。 有人设想,协议族可能有几种地址types。 地址types由附加的符号常量定义,使用前缀AF_而不是PF_。 AF_-identifier用于专门处理地址types而不是协议族的所有数据结构。 然而,这种协议和地址types分离的概念没有find实现的支持,AF_常量只是通过相应的协议标识符来定义,使得AF_与PF_常量之间的区别成为一个技术性的论据,没有明显的实际结果。 事实上,在正确使用这两种forms方面存在许多混淆。

AF_INET =地址格式,Internet = IP地址

PF_INET =数据包格式,Internet = IP,TCP / IP或UDP / IP

AF_INET是用于你正在创build的套接字(在这种情况下是一个Internet协议地址)的地址族。 例如,Linux内核支持29个其他地址系列,例如UNIX套接字和IPX,以及与IRDA和蓝牙(AF_IRDA和AF_BLUETOOTH)的通信,但是如果使用这样的低级别的话,这是值得怀疑的。

大多数情况下坚持AF_INET套接字编程通过networking是最安全的select。

意思是,AF_INET是指来自互联网的地址,具体是IP地址。

PF_INET是指协议中的任何东西,通常是套接字/端口。

有些情况下很重要。

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

对于套接字编程来说,Cygwin自认是一个巨大的混乱,但在AF_INET和PF_INET并不相同的情况下,这一个真实世界的例子。