套接字编程中AF_INET和PF_INET有什么区别?
我在 socket() 和 bind() 中使用AF_INET和PF_INET之间感到困惑 .
socket()
bind()
另外,如何在 sin_addr 字段中给出ip-address?
sin_addr
Beej's famous network programming guide给出了一个很好的解释:
在某些文档中,您会看到一个神秘的“PF_INET” . 这是一种奇怪的以太野兽,在自然界很少见,但我不妨在这里澄清一下 . 很久以前,人们认为可能是一个地址族(“AF_INET”中的“AF”代表什么)可能支持其协议族引用的几个协议(“PF_INET”中的“PF”代表什么) ) . 那没发生 . 那好吧 . 所以正确的做法是在你的struct sockaddr_in和PF_INET中使用AF_INET来调用socket() . 但实际上,您可以在任何地方使用AF_INET . 而且,既然这就是理查德史蒂文斯在他的书中所做的,那就是我在这里要做的 .
我在Linux内核源代码中发现PF_INET和AF_INET是相同的 . 以下代码来自Linux内核3.2.21树的文件 include/linux/socket.h ,第204行 .
/* Protocol families, same as address families. */ ... #define PF_INET AF_INET
AF =地址族
PF =协议族
含义, AF_INET 指的是来自互联网的地址,具体是IP地址 . PF_INET 指协议中的任何内容,通常是套接字/端口 .
AF_INET
PF_INET
考虑阅读socket(2)和bind(2)的手册页 . 对于 sin_addr 字段,只需执行以下操作即可进行设置:
struct sockaddr_in addr; inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
事实上,AF_和PF_是一回事 . 维基百科上有一些词会清除你的困惑
套接字接口的原始设计概念区分协议类型(系列)和每个可能使用的特定地址类型 . 设想协议族可能有几种地址类型 . 地址类型由其他符号常量定义,使用前缀AF_而不是PF_ . AF_标识符适用于专门处理地址类型而非协议族的所有数据结构 . 然而,这种分离协议和地址类型的概念尚未找到实现支持,并且AF_-常量仅由相应的协议标识符定义,使得AF_与PF_常数之间的区别成为没有重大实际后果的技术论证 . 实际上,正确使用这两种形式存在很多混淆 .
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指的是来自互联网的地址,具体是IP地址 .
PF_INET指协议中的任何内容,通常是套接字/端口 .
有些情况很重要 .
如果您在Cygwin中将AF_INET传递给 socket() ,则您的套接字可能会或可能不会随机重置 . 传递PF_INET可确保连接正常工作 .
对于套接字编程而言,Cygwin自认可是一个巨大的混乱,但它是一个真实的情况,其中AF_INET和PF_INET不相同 .
6 回答
Beej's famous network programming guide给出了一个很好的解释:
我在Linux内核源代码中发现PF_INET和AF_INET是相同的 . 以下代码来自Linux内核3.2.21树的文件 include/linux/socket.h ,第204行 .
AF =地址族
PF =协议族
含义,
AF_INET
指的是来自互联网的地址,具体是IP地址 .PF_INET
指协议中的任何内容,通常是套接字/端口 .考虑阅读socket(2)和bind(2)的手册页 . 对于
sin_addr
字段,只需执行以下操作即可进行设置:事实上,AF_和PF_是一回事 . 维基百科上有一些词会清除你的困惑
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指的是来自互联网的地址,具体是IP地址 .
PF_INET指协议中的任何内容,通常是套接字/端口 .
有些情况很重要 .
如果您在Cygwin中将AF_INET传递给
socket()
,则您的套接字可能会或可能不会随机重置 . 传递PF_INET可确保连接正常工作 .对于套接字编程而言,Cygwin自认可是一个巨大的混乱,但它是一个真实的情况,其中AF_INET和PF_INET不相同 .