AF_INET

AF_INET(又称PF_INET)是 IPv4 网络协议的套接字类型,AF_INET6 则是 IPv6 的;而AF_UNIX 则是Unix系统本地通信。

选择AF_INET 的目的就是使用IPv4 进行通信。因为IPv4 使用32位地址,相比IPv6 的128位来说,计算更快,便于用于局域网通信。

而且AF_INET 相比 AF_UNIX 更具通用性,因为Windows上有AF_INET 而没有AF_UNIX。

转载于:https://www.cnblogs.com/azbane/p/7605767.html

在 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、付费专栏及课程。

余额充值