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

时间:2011-07-18 06:37:38

标签: c linux sockets

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

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

另外,如何在sin_addr字段中提供ip-address?

7 个答案:

答案 0 :(得分:225)

Beej's famous network programming guide给出了一个很好的解释:

  

在某些文档中,您会看到一个神秘的“PF_INET”。   这是一种奇怪的以太野兽,在自然界很少见,但我   不妨在这里澄清一下。很久以前,它就是   以为这可能是一个地址族(“AF_INET”中的“AF”代表什么   for)可能支持他们引用的几个协议   协议族(“PF_INET”中的“PF”代表什么)   那没发生。那好吧。所以正确的做法是在你的身上使用AF_INET   在调用socket()时使用struct sockaddr_in和PF_INET。但   实际上,你可以在任何地方使用AF_INET。而且,从那以后   这就是理查德史蒂文斯在他的书中所做的,那就是我要做的   这里。

答案 1 :(得分:61)

我在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

答案 2 :(得分:47)

  • 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); 

答案 3 :(得分:11)

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

  

套接字接口的原始设计概念区分协议类型(系列)和每个可能使用的特定地址类型。设想协议族可能有几种地址类型。地址类型由其他符号常量定义,使用前缀AF_而不是PF_。 AF_标识符适用于专门处理地址类型而非协议族的所有数据结构。然而,这种协议和地址类型分离的概念尚未找到实现支持,并且AF_-常量仅由相应的协议标识符定义,使AF_与PF_常数之间的区别成为没有重大实际后果的技术论证。实际上,正确使用这两种形式存在很多混淆。

答案 4 :(得分:4)

AF_INET =地址格式,互联网= IP地址

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

AF_INET是用于您正在创建的套接字的地址系列(在本例中为Internet协议地址)。例如,Linux内核支持其他29个地址系列,例如UNIX套接字和IPX,以及与IRDA和蓝牙的通信(AF_IRDA和AF_BLUETOOTH,但是你很可能会在如此低的水平上使用它们。)< / p>

在大多数情况下,坚持使用AF_INET进行网络套接字编程是最安全的选择。

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

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

答案 5 :(得分:2)

有些情况很重要。

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

对于套接字编程而言,Cygwin自认为是一个巨大的混乱,但它 是一个真实世界的情况,其中AF_INET和PF_INET不相同。

答案 6 :(得分:1)

检查头文件即可解决问题。 可以检查那里的系统编译器。

对于我的系统,AF_INET == PF_INET

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

协议族,与地址族相同。

enter image description here