Linux下网络地址转换函数inet_pton和inet_ntop使用举例

本文提供了一个C语言程序示例,展示了如何使用inet_pton和inet_ntop函数将点分十进制表示的IPv4地址转换为网络字节序的32位整数形式,以及如何进行逆向转换。

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

#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>

int main(int argc,char ** argv)
{
    char dst[100] = {0};

    struct sockaddr_in serv;    
    memset(&serv,0,sizeof(struct sockaddr_in));

    //serv.sin_addr.s_addr <==> addr.s_addr
    if((inet_pton(AF_INET,"10.110.1.254",&serv.sin_addr.s_addr))==0)
        printf("inet_pton serv.sin_addr.s_addr=%u\n",serv.sin_addr.s_addr);    
    else
        printf("inet_pton serv.sin_addr.s_addr=%u\n",serv.sin_addr.s_addr);    
    if((inet_ntop(AF_INET,&serv.sin_addr.s_addr,dst,sizeof(dst)))==NULL)
        printf("inet_ntop\n");
    else
        printf("inet_ntop: dst=%s,sizeof(dst)=%lu\n",dst,sizeof(dst));
    printf("---------------------------------------------------------\n");
    struct in_addr addr;
    memset(&addr,0,sizeof(struct in_addr));
    if((inet_pton(AF_INET,"10.110.1.254",&addr.s_addr))==0)
        printf("inet_pton addr.s_addr=%u\n",addr.s_addr);    
    else
        printf("inet_pton addr.s_addr=%u\n",addr.s_addr);    

    if((inet_ntop(AF_INET,&addr.s_addr,dst,sizeof(dst)))==NULL) // replace inet_ntoa(addr)
        printf("inet_ntop\n");
    else
        printf("inet_ntop: dst=%s,sizeof(dst)=%lu\n",dst,sizeof(dst));

    return 0;
}

### 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
发出的红包

打赏作者

wellnw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值