套接字编程中AF_INET和PF_INET有什么区别?
我对在socket()
和bind()
中使用AF_INET和PF_INET感到困惑。
另外,如何在sin_addr
字段中提供ip-address?
答案 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_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 ==协议族
协议族,与地址族相同。