socket编程中,AF_INET与PF_INET有什么区别?
我在使用socket()
和bind()
时对使用AF_INET和PF_INET感到困惑。
此外,在sin_addr
字段中如何指定IP地址?
Beej's网络编程指南提供了一个很好的解释:
在一些文档中,你会看到对“PF_INET”这个神秘的东西的提及。这是一个奇怪的、罕见的存在,但我可以在这里澄清一下。很久以前,有人认为一个地址家族(“AF_INET”中的“AF”代表什么)可能支持多个协议,这些协议由它们的协议家族(“PF_INET”中的“PF”代表什么)引用。
没有发生。好吧。所以,在你的 struct sockaddr_in 中使用 AF_INET,在调用 socket()时使用 PF_INET 是正确的做法。但实际上,你可以在所有地方使用 AF_INET。而且,既然 W. Richard Stevens 在他的书中都这样做了,那我在这里也会这样做。
我在 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
/usr/src/linux-headers-<kernel_version>/include/linux/socket.h
中。 - Petr Javorikman <section> <topic>
,例如 man 2 bind
。 - Frerich RaabeAF_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 == 协议族
协议族与地址族相同。
/usr/src/linux-headers-X.X.X-XX-generic/include/linux/socket.h
- noobninja有些情况很重要。
如果在Cygwin中将AF_INET传递给socket()
,则您的套接字可能会随机重置。传递PF_INET可以确保连接正常工作。
Cygwin自认为是套接字编程的一个混乱,但这是一个真实世界的例子,其中AF_INET和PF_INET不相同。
#define PF_INET AF_INET
的代码。 - user207421