当前位置: 首页 > news >正文

inet_addr()和inet_aton()函数详解

         inet_addr()和inet_aton()这两个函数都将点分十进制格式的IPv4地址字符串转换为32位的网络字节序二进制值。

#include <arpa/inet.h>in_addr_t inet_addr(const char*string);
/*
传递点分十进制格式的字符串,将其转换为32位整数型数据并返回。该函数可检查无效的ip地址,填写大于255的地址数据,将返回INADDR_NONE。成功返回32位大端序整数型值。string:类似“192.168.1.1”的点分十进制格式的字符串*/int inet_aton(const char* string, struct in_addr*addr);
/* 
成功时返回1(true),失败时返回0(false)。
string:类似“192.168.1.1”的点分十进制格式的字符串
addr:保存转换结果的in_addr结构体变量的地址值
、该函数可检查无效的ip地址,失败返回0.
*/inet_addr()和inet_aton()两个函数功能相同,都是将点分十进制类型的字符串转换为32位网络字节序并返回。只不过inet_aton()函数直接指定了返回的结构体地址值。
特性inet_addr()inet_aton()
返回值网络字节序的in_addr_t成功返回1,失败返回0
错误处理返回INADDR_NONE(通常-1)返回0表示失败
处理255.255.255.255可能失败(与错误值冲突)可以正确处理
输出参数无,直接返回值通过第二个参数输出
安全性不推荐使用(已过时)推荐使用

 使用示例

#include <stdio.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <string.h>
int main()
{char* addr1 = "192.168.1.110";char* addr2 = "192.168.2.266";printf("addr1 = %s\n", addr1);//inet_addr()##############################if(inet_addr(addr1) == INADDR_NONE){printf("error addr1\n");}elseprintf("inet_addr(addr1) = 0x%x\n",inet_addr(addr1));printf("addr2 = %s\n", addr2);if(inet_addr(addr2) == INADDR_NONE){printf("error addr2\n");}elseprintf("inet_addr(addr2) = 0x%x\n", (unsigned)inet_addr(addr2));//inet_aton()###############################struct sockaddr_in addr_struct;memset(&addr_struct, 0, sizeof(addr_struct));if(inet_aton(addr1, &addr_struct.sin_addr))printf("addr_struct.sin_addr.s_addr is 0x%x\n", addr_struct.sin_addr.s_addr);	elseprintf("inet_aton is error!\n");	if(inet_aton(addr2, &addr_struct.sin_addr))printf("addr_struct.sin_addr.s_addr is 0x%x\n", addr_struct.sin_addr.s_addr);	elseprintf("inet_aton is error!\n");	return 0;
}

sockaddr_in 结构体:

struct sockaddr_in
{sa_family_t      sin_family;  //地址族(ADDress Family)uint16_t         sin_port;    //16位TCP/UDP端口号struct in_addr   sin_addr;    //32位ip地址  char             sin_zero[8]; //不使用,只是为了保证字节对齐
};struct in_addr
{in_addr_t        s_addr;      //32位IPV4地址
};

 

输出结果如下:

http://www.xdnf.cn/news/1005697.html

相关文章:

  • 【log4j2】将运行时变量注入日志、附性能对比与生产案例(动态日志实战)
  • JFLASH 提示license 配置操作 Sorry,no valid license for I-Flash found.
  • Trae重磅升级
  • Python 字典
  • 第六节 工程化与高级特性-TS配置选项解析
  • AUTOSAR图解==>AUTOSAR_TR_InteroperabilityOfAutosarTools
  • Rust 通用代码生成器:莲花,红莲尝鲜版三十六,哑数据模式图片初始化功能介绍
  • 测试完成的标准是什么?
  • Vue3项目与桌面端(C++)通过Websocket 对接接口方案实现
  • 【源码+文档+调试讲解】自习室系统
  • HALCON第二讲->预处理
  • vue中的doSave()方法
  • Excel大厂自动化报表实战(互联网金融-数据分析周报制作上)
  • 桥接模式(Bridge Pattern)
  • FastDFS
  • Flash数据写入及ECC纠错关键函数:Fapi_issueProgrammingCommand()
  • 【微软RDP协议】微软RDP协议技术架构特点与跨地域应用实践
  • Qt 环境搭建全流程详解:从下载到创建首个项目
  • 服务器部署普罗米修斯监控CentOS8
  • 2025 TechViz 新功能:3D协作,技术进化,体验升级
  • TypeScript 项目配置
  • 时事新闻:2025 伦敦科技周
  • Odoo 基于规则的线索自动分配实践指南
  • C++ STL容器汇总
  • 大中台应用的层次抽象
  • bisheng系列(三)- 本地部署(后端 1.2版本)
  • 亚马逊云服务器配置推荐
  • PCL 导入VS配置的大量依赖项名称快速读取
  • LLaMA Factory 微调教程:如何构建高质量数据集?
  • 重启杀手--误操作梳理