嵌入式 PF_INET 和 AF_INET的区别

本文解释了AF(ADDRESS FAMILY)与PF(PROTOCL FAMILY)的区别,在Windows中两者完全相同,而在Unix/Linux系统中有所不同。文章还介绍了在不同系统及函数中如何选择使用AF或PF。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AF 表示ADDRESS FAMILY 地址族 
PF 表示PROTOCL FAMILY 协议族

Winsock2.h中
#define AF_INET 0
#define PF_INET AF_INET

 

所以在windows中AF_INET与PF_INET完全一样

 

而在Unix/Linux系统中,在不同的版本中这两者有微小差别

对于BSD,是AF,对于POSIX是PF

 

在函数socketpair与socket的domain参数中有AF_UNIX,AF_LOCAL,AF_INET,PF_UNIX,PF_LOCAL,PF_INET.这几个参数有AF_UNIX=AF_LOCAL,PF_UNIX=PF_LOCAL, AF_LOCAL=PF_LOCAL, AF_INET=PF_INET.**建议:对于socketpair与socket的domain参数,使用PF_LOCAL系列,而在初始化套接口地址结构时,则使用AF_LOCAL.例如:     z= socket(PF_LOCAL, SOCK_STREAM,0);     adr_unix.sin_family= AF_LOCAL;

在 Unix/Linux 网络编程中,`AF_INET` `PF_INET` 是常见的常量定义,它们通常用于指定 socket 的地址族(Address Family)协议族(Protocol Family)。尽管它们的值在系统中是相同的(即 `AF_INET == PF_INET`),但在语义使用场景上存在一定的区分。 ### 地址族(AF_INET) `AF_INET` 表示地址族(Address Family),用于指定 socket 使用的地址格式。在创建 socket 地址结构(如 `struct sockaddr_in`)时,需要将 `sin_family` 字段设置为 `AF_INET`,以表明该结构用于 IPv4 地址。例如: ```c struct sockaddr_in addr; addr.sin_family = AF_INET; // 指定地址族为 IPv4 addr.sin_port = htons(8080); inet_pton(AF_INET, "192.168.1.1", &addr.sin_addr); ``` 此字段用于告诉内核在处理该 socket 地址时应使用哪种地址格式,`AF_INET` 对应 IPv4 地址格式[^1]。 ### 协议族(PF_INET) `PF_INET` 表示协议族(Protocol Family),用于指定 socket 创建时所使用的协议栈类型。当调用 `socket()` 函数创建 socket 时,`domain` 参数应使用 `PF_INET`,表示使用 IPv4 协议族进行通信。例如: ```c int sockfd = socket(PF_INET, SOCK_STREAM, 0); // 创建一个 IPv4 的 TCP socket ``` 这里的 `PF_INET` 告诉操作系统使用 IPv4 协议栈来处理该 socket,包括 IP 层传输层(如 TCP 或 UDP)的处理逻辑。 ### 区别总结 - `AF_INET` 用于地址结构中,指定地址格式为 IPv4。 - `PF_INET` 用于 `socket()` 函数中,指定协议栈为 IPv4。 虽然它们的数值相同,但在语义上应分别使用不同的常量以提高代码的可读性可维护性。在实践中,`PF_LOCAL`(或 `PF_UNIX`)常用于本地通信(如进程间通信),而 `AF_LOCAL` 用于地址结构中指定地址族[^1]。 ### 示例代码 以下是一个完整的 IPv4 TCP socket 初始化示例: ```c #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int main() { int sockfd = socket(PF_INET, SOCK_STREAM, 0); // 使用 PF_INET 指定协议族 if (sockfd < 0) { // 错误处理 } struct sockaddr_in addr; addr.sin_family = AF_INET; // 使用 AF_INET 指定地址族 addr.sin_port = htons(8080); inet_pton(AF_INET, "192.168.1.1", &addr.sin_addr); // 后续 bind、connect 等操作 return 0; } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值