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. 免费,好用的天气预报API

    不多说直接上! 一.API服务,天气API 网站:http://api.help.bj.cn/api/ 怎么使用网站有很详细的解释 $.ajax({ type: "GET", // ...

  2. 普通类中获取spring容器中的javabean对象

    spring提供了一系列的*Aware 接口,用于获取相应的对象,进行一系列的对象设置操作,此处实现ApplicationContextAware来获取ApplicationContext. 其他Aw ...

  3. A Python Environment Detector

    The user provide the method to get result(command on remote host), the check standard(a callback fun ...

  4. STP生成树的一些笔记

    一.STP概述 1.1.STP简介 交换网络环路主要由广播风暴.多帧复制和MAC地址表紊乱造成. 广播风暴:一个数据帧或包被传输到本地网段 (由广播域定义)上的每个节点就是广播:由于网络拓扑的设计和连 ...

  5. gcc limits.h的bug定位看include_next和默认搜索路径

    手编的交叉编译工具链经常报一堆宏未定义,例如下面是编译gtest的时候报_POSIX_PATH_MAX宏未定义,有时还会上报SSIZE_MAX等宏未定义: googletest/src/gtest-f ...

  6. STM32—DAC配置

    文章目录 一.DAC介绍 二.主要寄存器说明 三.代码及配置 一.DAC介绍 ADC是模数转换器,可以将模拟电压转换位数字信号:DAC是数模转换器,可以将数字信号转换为模拟电压. STM32F103Z ...

  7. ad room 拷贝

    当一个电路图中有多个相同组件的时候,我哦们一般使用 room格式拷贝. 基本思路 1.方法一  电路图使用repeat 多通道设计 2.简易的赋值粘贴,事实证明简单有效. 3.在pcb中删除对应一个单 ...

  8. BUUCTF刷题系列(2)5.27日记

    CTF-Bugku-安卓篇1signin Writeup Bugku安卓部分第一题,第七届山东省大学生网络安全技能大赛的题目,属于Android逆向分析.(常用工具:安卓模拟器.JEB.Cyberch ...

  9. NOIP 模拟 $38\; \rm a$

    题解 \(by\;zj\varphi\) 压行. 枚举两行,将中间的行压成一行,然后直接前缀和加二分. 注意边界细节问题. Code #include<bits/stdc++.h> #de ...

  10. javascript,html,正则表达式,邮箱密码验证

    <!DOCTYPE html> <html>     <head>         <meta charset="utf-8">   ...