news 2026/4/3 1:31:55

Linux 地址转换函数详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 地址转换函数详解

1. 概述

在Linux网络编程中,地址转换函数用于在点分十进制字符串二进制网络字节序之间转换IP地址。这些函数主要定义在 <arpa/inet.h> 头文件中。

2. 主要函数分类

2.1 IPv4专用函数(已过时,但仍有使用)

inet_aton() - 字符串转网络字节序
#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>intinet_aton(constchar*cp,structin_addr*inp);
  • 功能:将点分十进制字符串转换为32位网络字节序整数
  • 参数
    • cp:点分十进制IP地址字符串(如"192.168.1.1")
    • inp:存储转换结果的struct in_addr
  • 返回值:成功返回1,失败返回0
inet_addr() - 字符串转网络字节序(有缺陷)
in_addr_tinet_addr(constchar*cp);
  • 问题:无法处理255.255.255.255(返回INADDR_NONE)
  • 不推荐使用,建议使用inet_pton
inet_ntoa() - 网络字节序转字符串
char*inet_ntoa(structin_addrin);
  • 注意:返回指向静态缓冲区的指针,不可重入
  • 线程不安全

关于inet_ntoa

inet_ntoa 这个函数返回了一个char*, 很显然是这个函数自己在内部为我们申请了一块内存来保存ip 的结果. 那么是否需要调用者手动释放呢?

man 手册上说, inet_ntoa 函数, 是把这个返回结果放到了静态存储区. 这个时候不需要我们手动进行释放.

那么问题来了, 如果我们调用多次这个函数, 会有什么样的效果呢? 参见如下代码:

运行结果如下:

因为inet_ntoa 把结果放到自己内部的一个静态存储区, 这样第二次调用时的结果会覆盖掉上一次的结果.

在多线程环境下, 推荐使用inet_ntop, 这个函数由调用者提供一个缓冲区保存结果, 可以规避线程安全问题

2.2 IPv4/IPv6通用函数(推荐)

inet_pton() - 字符串转二进制(可移植)
intinet_pton(intaf,constchar*src,void*dst);
  • 功能:将字符串地址转换为二进制格式
  • 参数
    • af:地址族(AF_INET或AF_INET6)
    • src:源字符串
    • dst:目标缓冲区
  • 返回值:成功返回1,格式无效返回0,错误返回-1
inet_ntop() - 二进制转字符串(可移植)
constchar*inet_ntop(intaf,constvoid*src,char*dst,socklen_t size);
  • 功能:将二进制地址转换为字符串
  • 参数
    • af:地址族
    • src:源二进制地址
    • dst:目标字符串缓冲区
    • size:缓冲区大小(使用INET_ADDRSTRLEN 或INET6_ADDRSTRLEN)
  • 返回值:成功返回dst指针,失败返回NULL

3. 缓冲区大小常量

#defineINET_ADDRSTRLEN16// IPv4地址字符串最大长度#defineINET6_ADDRSTRLEN46// IPv6地址字符串最大长度

4. 函数对比与选择建议

函数地址族线程安全可重入推荐度
inet_aton()IPv4★★★☆☆
inet_addr()IPv4★☆☆☆☆(有缺陷)
inet_ntoa()IPv4★☆☆☆☆(线程不安全)
inet_pton()IPv4/IPv6★★★★★
inet_ntop()IPv4/IPv6★★★★★

总结

  • 推荐使用inet_pton()和inet_ntop(),它们支持IPv4/IPv6且线程安全
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/1 12:41:25

44、实时应用开发指南:Windows Embedded Compact 7 的应用与实践

实时应用开发指南:Windows Embedded Compact 7 的应用与实践 1. 硬件性能对实时性的影响 CPU 性能对计算延迟有显著影响,但对硬件延迟影响较小。更快的 CPU 能缩短内存数据计算或线程上下文切换的时间,但对访问 PCI 总线或写入 GPIO 的时间影响不大。在系统设计阶段,必须…

作者头像 李华
网站建设 2026/3/20 15:23:30

Excalidraw集成AI后有多强?输入文字自动生成草图

Excalidraw集成AI后有多强&#xff1f;输入文字自动生成草图 在一次产品评审会上&#xff0c;团队正讨论一个新功能的交互流程。产品经理口头描述&#xff1a;“用户从首页点击按钮&#xff0c;跳转到授权页面&#xff0c;登录后生成临时凭证&#xff0c;再返回主应用。”传统做…

作者头像 李华
网站建设 2026/3/31 1:32:33

15、活动目录中的资源发布与接口交互

活动目录中的资源发布与接口交互 在现代企业网络环境中,活动目录(Active Directory)扮演着至关重要的角色,它为网络资源的管理和访问提供了强大的支持。本文将深入探讨活动目录中的资源发布以及与其他目录服务的接口交互。 1. 发布资源概述 在活动目录里,发布资源指的是…

作者头像 李华
网站建设 2026/3/23 16:56:09

从零开始学Excalidraw:新手也能画出专业级手绘图表

从零开始学Excalidraw&#xff1a;新手也能画出专业级手绘图表 在远程协作成为常态的今天&#xff0c;你有没有遇到过这样的场景&#xff1f;——会议刚开始&#xff0c;主持人说&#xff1a;“我们先画个架构图理清思路。”于是大家盯着空白屏幕&#xff0c;有人小心翼翼地拖…

作者头像 李华
网站建设 2026/3/31 11:31:13

5、PowerShell 中的比较运算符、函数、开关和循环结构

PowerShell 中的比较运算符、函数、开关和循环结构 1. 比较运算符最佳实践 在编写 PowerShell 代码时,使用比较运算符需要遵循一些最佳实践,以确保代码的可读性和可维护性: - 避免双重否定语句 :开发代码时,应避免使用双重否定语句。例如,不要检查某个值是否不等于 …

作者头像 李华
网站建设 2026/3/31 22:12:42

11、利用 PowerShell 管理文件、文件夹和注册表项

利用 PowerShell 管理文件、文件夹和注册表项 在系统管理和自动化操作中,PowerShell 是一个强大的工具。它提供了丰富的 cmdlet 来帮助我们管理文件、文件夹和注册表项。下面将详细介绍如何使用 PowerShell 进行这些操作。 1. 创建和验证注册表项 首先,我们来看如何创建一…

作者头像 李华