【C++】inet_ptoa&inet_atop inet_pton&inet_ntop

这篇博客介绍了C++中用于IPv4地址转换的函数,包括inet_aton、inet_addr、inet_ntoa以及较新的inet_pton和inet_ntop。这些函数用于在点分十进制字符串和32位网络字节序二进制值之间进行转换,并且inet_pton和inet_ntop还支持IPv6地址。文章包含详细说明和相关链接。
  • inet_aton、inet_addr和inet_ntoa在点分十进制数串(例如”206.62.226.33”)与它的32位网络字节序二进制值间转换IPv4地址
  • 两个较新的函数:inet_pton和inet_ntop对IPv4和IPv6地址都能进行处理
/* Convert Internet number in IN to ASCII representation.  The return value
   is a pointer to an internal array containing the string.  */
extern char *inet_ntoa (struct in_addr __in) __THROW;

/* Convert from presentation format of an Internet number in buffer
   starting at CP to the binary network format and
### 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、付费专栏及课程。

余额充值