Answers:
Beej著名的网络编程指南给出了一个很好的解释:
在某些文档中,您会看到一个神秘的“ PF_INET”。这是在自然界中很少见到的怪异的以太兽,但我在这里还是要澄清一下。很久以前,有人认为一个地址族(“ AF_INET”中的“ AF”代表什么)可能支持其协议族引用的几种协议(“ PF_INET”中的“ PF”代表什么) )。
那没有发生。那好吧。因此,正确的做法是在结构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
意思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);
man <section> <topic>
,例如man 2 bind
。
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指协议中的任何内容,通常是套接字/端口。
在某些情况下,它很重要。
如果将AF_INET传递给 socket()
在Cygwin中将,则套接字可能会随机重置,也可能不会随机重置。传递PF_INET可确保连接正常运行。
Cygwin的是自不可否认的套接字编程一个巨大的混乱,但它是一个真实的世界情况下AF_INET和PF_INET是不相同的。
#define PF_INET AF_INET
在Cygwin的中找到了socket.h
。
检查头文件解决了问题。可以检查那里的系统编译器。
对于我的系统,AF_INET == PF_INET
AF ==地址族和PF ==协议族
协议族,与地址族相同。
/usr/src/linux-headers-X.X.X-XX-generic/include/linux/socket.h