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


205

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

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

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


只要搜索网:一个结果是
运德Cirkel

我也一直在想这个。它们似乎在不同编码器之间的套接字调用中可互换使用。
马特

@MattH两者都与新的Linux内核相同。您可以在下面的Duke答案中找到相同的内容。
SP Sandhu

Answers:


250

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

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


68

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

当然,杜克,对于以前的内核也一样,我的意思是3.0版之前的内核?
SP Sandhu

1
据我所知,在内核和libc的所有版本中,PF_ * == AF_ *
Duke

在非Linux平台上是这样吗?
好人,

1
我想确保,您需要检查包含的头文件:)
Duke Duke

在Ubuntu / Debian上,我在/usr/src/linux-headers-<kernel_version>/include/linux/socket.h
Petr Javorik '19

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

意思AF_INET是指来自Internet的地址,特别是IP地址。PF_INET指协议中的任何内容,通常是套接字/端口。

考虑阅读有关socket(2)bind(2)的手册页。对于该sin_addr字段,只需执行以下操作即可进行设置:

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

谢谢@codemac,我用过addr.sin_addr.s_addr = inet_addr(“ 127.0.0.1”); 但是inet_pton()的作用是什么?
SP Sandhu

同样对于手册页,当我键入man bind(2)或man bind()时,终端给出了意外的令牌'('错误,而man bind提供了bash内置函数中bind的解释。 bind()function?
SP Sandhu

@ jatt.beas:语法为man <section> <topic>,例如man 2 bind
Frerich Raabe

11

实际上,AF_和PF_是同一件事。维基百科上有一些单词可以消除您的困惑

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


4

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是指来自Internet的地址,特别是IP地址。

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


3

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

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

Cygwin的是自不可否认的套接字编程一个巨大的混乱,但它一个真实的世界情况下AF_INET和PF_INET是不相同的。


6
请解释。我#define PF_INET AF_INET在Cygwin的中找到了socket.h
罗恩侯爵(Marques of Lorne)

3

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

对于我的系统,AF_INET == PF_INET

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

协议族,与地址族相同。

在此处输入图片说明


1
/usr/src/linux-headers-X.X.X-XX-generic/include/linux/socket.h
noobninja '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.