inet_aton, inet_ntoa, inet_addr, inet_network函数
时间:2019-02-19
本文章向大家介绍inet_aton, inet_ntoa, inet_addr, inet_network函数,主要包括inet_aton, inet_ntoa, inet_addr, inet_network函数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在网络编程中, 经常会将网络字节转为本地字节或者将本地字节转为网络字节, 但是如果每次我们都是都通过htonl
, ntohl
函数需要将10进制转为整数, 甚至还用将字符串转为整数, 再转为网络字节, 或者反过来都是很麻烦的. 还好linux都是提供很方便的函数让两者之间进行转换.
转换函数
linux提供了多种函数满足我们任何转换的需求, 这都是inet_xxx
族系列
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
int inet_aton(const char *ip, struct in_addr *inp); // 本地转网络
char * inet_ntoa(struct in_addr inp); // 网络转本地
in_addr_t inet_addr(const char *ip); // 返回网络字节
in_addr_t inet_network(const char *ip); // 返回本地字节
接下来我们来在分析一下这几个函数
1. inet_aton函数
将点分十进制IP转化为网络字节序存放在inp中, 并返回该网络字节序对应的整数.
int inet_aton(const char *ip, struct in_addr *inp);
失败 : 返回0.
成功 : 返回IP对应的网络字节序的数.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
// 传入 127.0.0.1
int main(int argc, char *argv[])
{
if(argc != 2)
exit(-1);
struct in_addr addr;
if(inet_aton(argv[1], &addr) == 0)
exit(-1);
printf("0x%08x\n", addr.s_addr); // 0x0100007f
exit(EXIT_SUCCESS);
}
2. inet_ntoa函数
将一个32位网络字节序的二进制IP地址转换成相应的点分十进制的IP地址.
char *inet_ntoa(struct in_addr inp);
失败 : 返回NULL.
成功 : 返回字符串指针.
注意 : 该函数不是线程安全函数, 不可重入. 因为不同线程调用会覆盖掉其他线程的缓冲区.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char *argv[])
{
struct in_addr net_addr;
net_addr.s_addr = 0x0100007f; // 127.0.0.1
char *host_addr;
host_addr = inet_ntoa(net_addr);
printf("%s\n", host_addr); // 127.0.0.1
exit(EXIT_SUCCESS);
}
3. inet_addr函数
将一个点分十进制转换网络字节序IP.
in_addr_t inet_addr(const char *ip);
失败 : 返回INADDR_NONE. 部分手册上返回的是-1, 这个问题与inet_network
一样了.
成功 : 返回网络字节IP.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
// 输入 127.0.0.1
int main(int argc, char *argv[])
{
in_addr_t addr;
addr = inet_addr(argv[1]);
printf("0x%08x\n", addr); // 0x0100007f
exit(EXIT_SUCCESS);
}
4. inet_network函数
将点分十进制IP转化为主机字节序
in_addr_t inet_network(const char *ip);
失败 : 返回-1.
成功 : 返回主机对应的数.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
// 输入 127.0.0.1
int main(int argc, char *argv[])
{
in_addr_t addr;
addr = inet_network(argv[1]);
printf("0x%08x\n", addr); // 0x7f000001
exit(EXIT_SUCCESS);
}
该函数在某些情况下并不正确, 如果IP地址是255.255.255.255
返回的则是0xffffffff
, 转为十进制就是-1
. 分不清出-1
表示的是错误的返回值还是IP地址. 可以使用inet_pton()
和inet_ntop()
函数来代替, 这里就不详细的分析了, 有兴趣的可以自己查一下.
完整代码 : inet族
总结
本节分析了4个函数, 重点需要掌握的是inet_aton
函数.
- 4个函数使用, 以及返回值
inet_network
返回值的问题inet_ntoa
并不是线程安全的函数
- WinDbg调试.NET程序入门
- Release编译模式下,事件是否会引起内存泄漏问题初步研究 疑问:
- 10种简单的Java性能优化学习
- 巧用枚举类型,实现项目的多语言切换
- 影响Java调用性能有哪些因素
- 如何为可扩展系统进行Java Socket编程
- 如何使用Windows卷影拷贝服务恢复文件和文件夹
- .net字符串数组查找方式效率比较
- 使用Ring Buffer构建高性能的文件写入程序
- 一行代码调用实现带字段选取+条件判断+排序+分页功能的增强ORM框架
- PDF.NET数据开发框架实体类操作实例
- 利用Burp Suite对OWASP Juice Shop进行渗透测试
- Java同步问题面试知识学习
- Android UI控件系列:LinearLayout(线性布局)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 深入理解消息中间件技术之RabbitMQ服务
- 手把手从0开始教你搭建Jumpserver,为服务器安全保驾护航!
- 企业面试题|最常问的MySQL面试题集合(二)
- 值得一看的35个Redis面试题总结
- 容器技术|Docker三剑客之docker-machine
- 企业面试题|最常问的MySQL面试题集合(三)
- 「微服务架构」API版本控制最佳实践介绍
- 2020年最新字节、阿里、腾讯、爱奇艺等BAT Android社招高频面试题,押题99.98%!
- 使用镜像部署 Hexo 静态页面
- 基于zmq RPC简单C++实现
- App为什么会crash?一篇文章带你探究根本原因 ,事情没有你想得那么简单!
- MySQL 8.0新特性 — 用户管理
- Java15的新特性
- ZooKeeper到底为Kafka的做了什么牺牲?
- Flutter原理:三棵重要的树(渲染过程、布局约束、应用视图的构建等)