linux内核中使用inet_ntop,linux网络编程之inet_pton和inet_ntop函数

本文介绍了Linux系统中inet_pton和inet_ntop两个关键函数,用于在IPv4/IPv6的点分十进制和整数形式之间进行转换,包括函数原型、参数说明和使用实例,帮助开发者理解地址族和避免内存溢出问题。

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

Linux下这2个IP地址转换函数,可以在将IP地址在“点分十进制”和“整数”之间转换

而且,inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6。算是比较新的函数了。

1、inet_pton函数原型如下[将“点分十进制” -> “整数”]

#include

#include

#include

int inet_pton(int af, const char *src, void *dst);

这个函数转换字符串到网络地址,第一个参数af是地址族,转换后存在dst中

inet_pton 是inet_addr的扩展,支持的多地址族有下列:

af = AF_INET

src为指向字符型的地址,即ASCII的地址的首地址(ddd.ddd.ddd.ddd格式的),函数将该地址

转换为in_addr的结构体,并复制在*dst中

af =AF_INET6

src为指向IPV6的地址,,函数将该地址

转换为in6_addr的结构体,并复制在*dst中

如果函数出错将返回一个负值,并将errno设置为EAFNOSUPPORT,如果参数af指定的地址族和src格式不对,函数将返回0。

2、inet_ntop函数原型如下[将 “整数”-> “点分十进制”]

#include

#include

#include

const char *inet_ntop(int af, const void *src, char *dst, socklen_t cat);

这个函数转换网络二进制结构到ASCII类型的地址,参数的作用和上面相同,只是多了一个参数socklen_t cnt,他是所指向缓存区dst的大小,避免溢出,如果缓存区太小无法存储地址的值,则返回一个空指针,并将errno置为ENOSPC

下面例子

0818b9ca8b590ca3270a3433284dd417.png

结果

0818b9ca8b590ca3270a3433284dd417.png

### C++ 中 `inet_pton` `inet_ntop` 的使用方法及效果差异 #### 一、功能概述 `inet_pton` `inet_ntop` 是用于处理 IP 地址字符串其二进制形式之间相互转换的标准库函数。 - **`inet_pton`**: 将点分十进制表示法的 IPv4 或冒号十六进制表示法的 IPv6 转换为网络字节序的二进制形式[^1]。 - **`inet_ntop`**: 将网络字节序的二进制形式的 IPv4 或 IPv6 地址转换回可读的字符串形式[^5]。 两者的主要区别在于方向不同:一个是将字符串转为二进制,另一个是从二进制转为字符串。 --- #### 二、函数原型与参数说明 ##### 1. `inet_pton` ```c #include <arpa/inet.h> int inet_pton(int family, const char *strptr, void *addrptr); ``` - 参数解释: - `family`: 协议族,取值可以是 `AF_INET`(IPv4)或 `AF_INET6`(IPv6)。 - `strptr`: 输入的 IP 地址字符串指针。 - `addrptr`: 输出存储地址的二进制数据结构指针。 - 返回值: - 成功返回 `1`; - 如果输入格式不合法,则返回 `0`; - 发生错误时返回 `-1` 并设置相应的错误码[^2]。 ##### 2. `inet_ntop` ```c #include <arpa/inet.h> const char* inet_ntop(int family, const void *addrptr, char *strptr, socklen_t size); ``` - 参数解释: - `family`: 同上,协议族类型。 - `addrptr`: 输入的二进制地址指针。 - `strptr`: 存储输出字符串的目标缓冲区指针。 - `size`: 缓冲区大小,通常建议至少为 `INET_ADDRSTRLEN` 对于 IPv4 或 `INET6_ADDRSTRLEN` 对于 IPv6[^4]。 - 返回值: - 成功返回指向目标缓冲区的指针; - 失败返回 `NULL` 并设置相应错误码。 --- #### 三、代码示例 以下是两个函数的具体实现案例: ##### 示例 1: 使用 `inet_pton` 进行字符串到二进制的转换 ```cpp #include <iostream> #include <arpa/inet.h> int main() { const char *ip_str = "192.168.1.1"; struct in_addr ip_addr; if (inet_pton(AF_INET, ip_str, &ip_addr) <= 0) { std::cerr << "Invalid address or error occurred." << std::endl; return 1; } std::cout << "Binary representation of IP: " << ntohl(ip_addr.s_addr) << std::endl; return 0; } ``` 上述程序通过调用 `inet_pton` 验证并解析了一个标准的 IPv4 字符串,并将其转化为整数形式显示。 ##### 示例 2: 使用 `inet_ntop` 实现反向操作 ```cpp #include <iostream> #include <arpa/inet.h> #define INET_ADDRSTRLEN 16 int main() { char ip_addr[INET_ADDRSTRLEN]; struct in_addr st_ip; inet_pton(AF_INET, "10.67.68.80", &st_ip); if (!inet_ntop(AF_INET, &st_ip, ip_addr, sizeof(ip_addr))) { std::cerr << "Conversion failed!" << std::endl; return 1; } std::cout << "IP Address: " << ip_addr << std::endl; return 0; } ``` 此例子展示了如何利用 `inet_ntop` 把之前由 `inet_pton` 得到的结果还原成人类易懂的形式。 --- #### 四、主要区别总结 | 特性 | `inet_pton` | `inet_ntop` | |-----------------|-------------------------------------|------------------------------------| | 功能方向 | 字符串 → 二进制 | 二进制 → 字符串 | | 主要用途 | 解析用户输入的 IP 地址 | 显示调试信息或者日志记录 | | 错误检测能力 | 提供更精确的错误反馈 | 较少关注具体错误细节 | | 性能优化 | 更高效 | 可能涉及额外内存分配 | 此外需要注意的是,在现代开发实践中推荐优先选用这些新版本 API 来替代旧版如 `inet_aton()` 等因为它们提供了更强健的支持尤其是针对 IPv6 场景下的兼容性改进[^3]^。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值