首页 文章

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

提问于
浏览
175

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

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

另外,如何在 sin_addr 字段中给出ip-address?

6 回答

  • 11

    Beej's famous network programming guide给出了一个很好的解释:

    在某些文档中,您会看到一个神秘的“PF_INET” . 这是一种奇怪的以太野兽,在自然界很少见,但我不妨在这里澄清一下 . 很久以前,人们认为可能是一个地址族(“AF_INET”中的“AF”代表什么)可能支持其协议族引用的几个协议(“PF_INET”中的“PF”代表什么) ) . 那没发生 . 那好吧 . 所以正确的做法是在你的struct sockaddr_in和PF_INET中使用AF_INET来调用socket() . 但实际上,您可以在任何地方使用AF_INET . 而且,既然这就是理查德史蒂文斯在他的书中所做的,那就是我在这里要做的 .

  • 2

    我在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
    
  • 4
    • AF =地址族

    • PF =协议族

    含义, 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);
    
  • 47

    事实上,AF_和PF_是一回事 . 维基百科上有一些词会清除你的困惑

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

  • 212

    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指协议中的任何内容,通常是套接字/端口 .

  • 56

    有些情况很重要 .

    如果您在Cygwin中将AF_INET传递给 socket() ,则您的套接字可能会或可能不会随机重置 . 传递PF_INET可确保连接正常工作 .

    对于套接字编程而言,Cygwin自认可是一个巨大的混乱,但它是一个真实的情况,其中AF_INET和PF_INET不相同 .

相关问题