Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
socket编程中AF_INET和PF_INET的区别是什么?_C_Linux_Sockets - Fatal编程技术网

socket编程中AF_INET和PF_INET的区别是什么?

socket编程中AF_INET和PF_INET的区别是什么?,c,linux,sockets,C,Linux,Sockets,socket编程中AF_INET和PF_INET的区别是什么 我对在socket()和bind()中使用AF\u INET和PF\u INET感到困惑 另外,如何在sin\u addr字段中提供ip地址? AF=地址族 PF=协议系列 意思是说,AF_INET指的是来自互联网的地址,特别是IP地址PF_INET指协议中的任何内容,通常是套接字/端口 考虑阅读和的手册页。对于sin\u addr字段,只需执行以下操作即可进行设置: struct sockaddr_in addr; inet_pt

socket编程中AF_INET和PF_INET的区别是什么

我对在
socket()
bind()中使用AF\u INET和PF\u INET感到困惑

另外,如何在
sin\u addr
字段中提供ip地址?

  • AF=地址族
  • PF=协议系列
意思是说,
AF_INET
指的是来自互联网的地址,特别是IP地址
PF_INET
指协议中的任何内容,通常是套接字/端口

考虑阅读和的手册页。对于
sin\u addr
字段,只需执行以下操作即可进行设置:

struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr); 
给出了一个很好的解释:

在一些文档中,您会看到提到一个神秘的“PF_INET”。 这是一种奇怪的以太野兽,在自然界中很少见,但我 不妨在这里澄清一下。很久以前有一次 认为可能是一个地址族(“AF_INET”中的“AF”代表什么 for)可能支持其用户引用的多个协议 协议系列(“PF_INET”中的“PF”代表什么)。
那没有发生。哦,好吧。因此,正确的做法是在您的应用程序中使用AF_INET 调用socket()时,在中使用struct sockaddr_和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

事实上,AF_u和PF_u是一回事。维基百科上有一些文字可以消除你的困惑

套接字接口的原始设计概念区分了协议类型(系列)和每个协议类型可能使用的特定地址类型。设想一个协议族可以有几种地址类型。地址类型由额外的符号常量定义,使用前缀AF_u而不是PF_u。AF-标识符适用于专门处理地址类型而非协议系列的所有数据结构。然而,这种协议和地址类型分离的概念还没有得到实现支持,AF_u常数只是由相应的协议标识符定义的,这使得AF_u常数和PF_u常数之间的区别成为一个没有重大实际后果的技术论据。事实上,在正确使用这两种形式时存在许多混乱


在某些情况下,这很重要

如果您在Cygwin中将AF_INET传递到
socket()
,您的套接字可能会被随机重置,也可能不会被随机重置。通过PF_INET可确保连接正常工作


Cygwin自认是socket编程的一个大烂摊子,但在现实世界中,AF_INET和PF_INET并不完全相同。

AF_INET=地址格式,Internet=IP地址

PF_INET=数据包格式,Internet=IP,TCP/IP或UDP/IP

AF_INET是用于正在创建的套接字的地址族(在本例中为Internet协议地址)。例如,Linux内核支持29个其他地址系列,如UNIX套接字和IPX,还支持与IRDA和Bluetooth(AF_IRDA和AF_Bluetooth)的通信,但您是否会在如此低的级别上使用它们是值得怀疑的

在大多数情况下,使用AF_INET通过网络进行套接字编程是最安全的选择

意思是,AF_INET指的是来自互联网的地址,特别是IP地址


PF_INET指协议中的任何内容,通常是套接字/端口。

检查头文件可以解决问题。 可以检查是否有系统编译器

对于我的系统,AF_INET==PF_INET

AF==地址系列和PF==协议系列

协议族,与地址族相同


只需搜索一下网络:一个结果是我也一直在想这个问题。它们似乎可以在不同编码者之间的套接字调用中互换使用。@MattH根据新的Linux内核,它们都是相同的。你可以在下面杜克的答案中找到相同的答案。谢谢@codemac,我使用了addr.sin_addr.s_addr=inet_addr(“127.0.0.1”);但inet_pton()的作用是什么?同样对于手册页,当我键入man bind(2)或man bind()时,终端会给出意外的标记“(”错误,而man bind会解释bash内置中的bind。如何获取bind()的手册页。我指的是bind()function?@jatt.beas:语法是
man
,例如
man2bind
。当然,杜克,以前的内核也是一样的,我指的是3.0版之前的内核?据我所知,在所有版本的内核和libc中,PF_*=AF_*在非linux平台上是真的吗?我想确定一下,你需要检查包含的头文件:)在Ubuntu/Debian上,我在
/usr/src/linux headers-/include/linux/socket.h
中找到了AF定义,请解释一下。我在Cygwin的
socket.h
/usr/src/linux-headers-X.X.X-XX-generic/include/linux/socket.h