3.1 inet_aton()

int inet_aton(const char *cp, struct in_addr *inp);

  • 参数说明:

  • cp : IPv4点分十进制字符串,例如“192.168.1.2”、“10.28.1.1”等;

  • inp: 点分十进制转换成二进制后的结构体(网络字节序)

  • 返回值:成功返回非0;失败返回0

注意:

这个函数已经将inp转换为网络字节序;已经将inp转换为网络字节序;已经将inp转换为网络字节序;

  • 举例说明:
int inet_aton_demo()
{
char *string="192.168.1.2";
struct in_addr ip={0};
unsigned char *c=NULL;
int integer=0xc0a80102;/*用来对比测试*/ if(!inet_aton(string, &ip)){
printf("%s:%d error\n", __func__, __LINE__);
return -1;
}
printf("%8.8x ---- %u\n", ip.s_addr, ip.s_addr);/**/
c=(char *)&ip.s_addr;
printf("%2.2x ---- %2.2x --- %2.2x --- %2.2x\n", *c, *(c+1), *(c+2), *(c+3)); printf("%8.8x ---- %u\n", integer, integer);/**/
c=(char *)&integer;
printf("%2.2x ---- %2.2x --- %2.2x --- %2.2x\n", *c, *(c+1), *(c+2), *(c+3));
}

编译运行,结果如下:

root@ubantu:/mnt/hgfs/em嵌入式学习记录/schedule调度器# ./demo.out
0201a8c0 ---- 33663168
c0 ---- a8 --- 01 --- 02 --->inet_aton()转换后的字节序 c0a80102 ---- 3232235778
02 ---- 01 --- a8 --- c0 --->正常的主机字节序
root@ubantu:/mnt/hgfs/em嵌入式学习记录/schedule调度器#

从上述结果可以看出:

inet_aton()会将点分十进制的字符串转换为网络字节序的二进制数。此时如果要做网络用途使用的话,无需再次转换(即,无需再通过htonl做转换);但是如果想在本地上查看转换后的结果,则需要做一个转换(需要使用ntohl)。

3.2 inet_ntoa()

char *inet_ntoa(struct in_addr in);

  • 参数说明:

  • inp: 点分十进制转换成二进制后的结构体(网络字节序)

  • 返回值 : IPv4点分十进制字符串指针,例如“192.168.1.2”、“10.28.1.1”等;

注意:

不可重入,不可重入,不可重入

​ 因为转换后的字符串使用同一块静态内存区,再次调用会被覆盖。

  • 举例说明:
int inet_ntoa_demo()
{
char *string=NULL;
struct in_addr ip;
unsigned char *c=NULL; ip.s_addr = 0xc0a80102;
/*
* 1. char *inet_ntoa(struct in_addr in);
*/ if(!(string=inet_ntoa(ip))){
printf("%s:%d %s\n", __func__, __LINE__, strerror);
return -1;
}
printf("%s\n", string);
printf("%8.8x ---- %u\n", ip.s_addr, ip.s_addr);/**/
c=(char *)&ip.s_addr;
printf("%2.2x ---- %2.2x --- %2.2x --- %2.2x\n", *c, *(c+1), *(c+2), *(c+3)); ip.s_addr = htonl(0xc0a80102);/*转换为网络字节序*/
if(!(string=inet_ntoa(ip))){
printf("%s:%d %s\n", __func__, __LINE__, strerror);
return -1;
}
printf("%s\n", string);
printf("%8.8x ---- %u\n", ip.s_addr, ip.s_addr);/**/
c=(char *)&ip.s_addr;
printf("%2.2x ---- %2.2x --- %2.2x --- %2.2x\n", *c, *(c+1), *(c+2), *(c+3)); /*
root@ubantu:/mnt/hgfs/em嵌入式学习记录/schedule调度器# ./demo.out
0201a8c0 ---- 33663168
c0 ---- a8 --- 01 --- 02
root@ubantu:/mnt/hgfs/em嵌入式学习记录/schedule调度器#
*/
}

编译运行,结果如下:

root@ubantu:/mnt/hgfs/em嵌入式学习记录/schedule调度器# ./demo.out
2.1.168.192
c0a80102 ---- 3232235778 ---主机字节序
02 ---- 01 --- a8 --- c0 192.168.1.2
0201a8c0 ---- 33663168 ---网络字节序
c0 ---- a8 --- 01 --- 02
root@ubantu:/mnt/hgfs/em嵌入式学习记录/schedule调度器#

从上述结果可以看出:

inet_ntoa()会将二进制数以网络字节序的方式解析为点分十进制字符串。因此我们再定义in_addr变量时,直接将其s_addr的值转换为网络字节序;但是如果想在本地上查看转换后的结果,则需要做一个转换(需要使用ntohl)。

小结: 使用in_addr.s_addr时,这个值里存储的应该一直为网络字节序。本地想查看该变量的值,应作一次ntohl转换;如果做网络收发等等,则无需做任何转换。

inet_aton和inet_ntoa的更多相关文章

  1. mysql 使用inet_aton和inet_ntoa处理ip地址数据

    mysql 使用inet_aton和inet_ntoa处理ip地址数据 mysql提供了两个方法来处理ip地址 inet_aton 把ip转为无符号整型(4-8位) inet_ntoa 把整型的ip转 ...

  2. 利用mysql的inet_aton()和inet_ntoa()函数存储IP地址的方法

    原文:https://www.jb51.net/article/29962.htm 当前很多应用都适用字符串char(15)来存储IP地址(占用16个字节),利用inet_aton()和inet_nt ...

  3. IP地址转换函数——inet_pton inet_ntop inet_aton inet_addr inet_ntoa

    inet_pton NAME     inet_pton - 将 IPv4 和 IPv6 地址从点分十进制转换为二进制 SYNOPSIS #include <arpa/inet.h> in ...

  4. IP处理函数inet_aton()和inet_ntoa(),inet_pton,inet_ntop

    inet_ntoa: 功能: 将一个IP转换成一个互联网标准点分格式的字符串. 原型: char FAR * inet_ntoa( struct in_addr in); 返回值: 如果正确,返回一个 ...

  5. MySQL的IP处理函数inet_aton()和inet_ntoa()

    给出一个作为字符串的网络地址的"点地址"(如127.0.0.1)表示,返回一个代表该地址数值的整数.地址可以是4或8比特地址. mysql> SELECT inet_aton ...

  6. [MySQL]IP处理函数inet_aton()和inet_ntoa()

    INET_ATON(expr) 给出一个作为字符串的网络地址的"点地址"(如127.0.0.1)表示,返回一个代表该地址数值的整数.地址可以是4或8比特地址. mysql> ...

  7. 接口处理篇 accept bind connect atan2 htons inet_addr inet_aton inet_ntoa listen ntohl recv send sendto socket

    accept(接受socket连线) 相关函数 socket,bind,listen,connect 表头文件 #include<sys/types.h> #include<sys/ ...

  8. [转载]Linux网络编程IPv4和IPv6的inet_addr、inet_aton、inet_pton等函数小结

    转载:http://blog.csdn.net/ithomer/article/details/6100734 知识背景: 210.25.132.181属于IP地址的ASCII表示法,也就是字符串形式 ...

  9. 网络地址转换相关函数使用(inet_addr,inet_ntoa,inet_addr)

    aa 相关函数原型及参数类型: 函数原型:int inet_aton(const char *cp, struct in_addr *inp); in_addr_t inet_addr(const c ...

随机推荐

  1. Hadoop 3.1.1 - Yarn - 使用 FPGA

    在 Yarn 上使用 FPGA 前提 YARN 目前只支持通过 IntelFpgaOpenclPlugin 发布的 FPGA 资源 YARN NodeManager 所在的机器上必须预先安装供应商的驱 ...

  2. 2021qwb [强网先锋]赌徒 Writeup + 环境复现

    2021 qwb [强网先锋]赌徒 Writeup + 环境复现(win10) 1.本地环境复现(win10+phpStudy2018) 将比赛文件复制到phpStudy的\phpStudy\PHPT ...

  3. 一些Shell脚本记录

    查看换行符 使用vim打开文件,输入:set ff?.根据返回结果可以文件类型 字符串 opcenter.sjb.bz [root@opcenter backup]# echo ${HOSTNAME% ...

  4. Github连接远程仓库详细操作

    首先 咱们需要配置ssh密钥   如何生成密钥呢    我们先来看下命令 在桌面新建一个文件夹,命名规范尽量不要使用中文,然后在文件夹内  新建测试文本: 如图   在文件夹内空白处右击进入GIt b ...

  5. ES6与ES2015、ES2016以及ECMAScript的区别

    1. ECMAScript 和 JavaScript 的关系 ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现. javascript是netscape ...

  6. XV6学习笔记(1) : 启动与加载

    XV6学习笔记(1) 1. 启动与加载 首先我们先来分析pc的启动.其实这个都是老生常谈了,但是还是很重要的(也不知道面试官考不考这玩意), 1. 启动的第一件事-bios 首先启动的第一件事就是运行 ...

  7. Linux线程简单介绍

    1.进程与线程 2.使用线程的理由 3.有关线程操作的函数 4.线程之间的互斥 5.线程之间的同步 6.试题最终代码 1.进程与线程 进程是程序执行时的一个实例,即它是程序已经执行到何种程度的数据结构 ...

  8. Alibaba-技术专区-RocketMQ 延迟消息实现原理和源码分析

    痛点背景 业务场景 假设有这么一个需求,用户下单后如果30分钟未支付,则该订单需要被关闭.你会怎么做? 之前方案 最简单的做法,可以服务端启动个定时器,隔个几秒扫描数据库中待支付的订单,如果(当前时间 ...

  9. pikachu CSRF

    CSRF简介 CSRF 是 Cross Site Request Forgery 的 简称,中文名为跨域请求伪造在CSRF的攻击场景中,攻击者会伪造一个请求(一般是一个链接)然后欺骗目标用户进行点击, ...

  10. 内存吞金兽(Elasticsearch)的那些事儿 -- 认识一下

    背景及常见术语 背景 Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene 基础之上. Lucene 可以说是当下最先进.高性能.全功能的搜索引擎库- ...