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. DVWA靶场练习-暴力破解

    一.暴力破解 (Brute Force)    暴力破解是Web安全领域的一个基础技能,破解方法论为:构建常见用户名及弱口令 因此需要好的字典,对应破解场景构建特定的用户名密码,以及还需要具有灵活编写 ...

  2. http request 请求拦截器,有token值则配置上token值

    // http request 请求拦截器,有token值则配置上token值 axios.interceptors.request.use( config => { if (token) { ...

  3. .Net Core如何优雅的实现中间件

    在.Net Core的源码中,很多地方都有中间件的地方,Kestrel Server和Asp.net Core 等都用了中间件的设计,比如在Kestrel Server中,Http协议的1.0, 1. ...

  4. [TensorFlow2.0]-张量与常用函数

    本人人工智能初学者,现在在学习TensorFlow2.0,对一些学习内容做一下笔记.笔记中,有些内容理解可能较为肤浅.有偏差等,各位在阅读时如有发现问题,请评论或者邮箱(右侧边栏有邮箱地址)提醒. 若 ...

  5. 使用Eclipse下载CRaSH源代码

    Eclipse for Java Developers (Juno)本身有一个eGit组件,通过它可以直接从Git源码库中下载源代码,以下载 CRaSH 为例说明: 从主页上的"Develo ...

  6. bat脚本中%~dp0含义解释

    在Windows脚本中,%i类似于shell脚本中的$i,%0表示脚本本身,%1表示脚本的第一个参数,以此类推到%9,在%和i之间可以有"修饰符"(完整列表可通过"for ...

  7. [数据结构]ODT(珂朵莉树)实现及其应用,带图

    [数据结构]ODT(珂朵莉树)实现及其应用,带图 本文只发布于博客园,其他地方若出现本文均是盗版 算法引入 需要一种这样的数据结构,需要支持区间的修改,区间不同值的分别操作. 一般的,我们会想到用线段 ...

  8. SpringBoot开发十-开发登录,退出功能

    需求介绍-开发登录,退出功能 访问登录页面:点击头部区域的链接打开登录页面 登录: 验证账号,密码,验证码 成功时生成登录凭证发放给客户端,失败时跳转回登录页面 退出: 将登录状态修改为失效的状态 跳 ...

  9. linux联网、远程

    使用VMware虚拟机创建linux系统CentOS 7,连接网络以及远程Moba工具. 一.首先安装好VMware虚拟机和CentOS系统,网上很多教程,不在赘述. 二.打开VMware进行配置 1 ...

  10. Pikachu-暴力破解模块

    一.概述 "暴力破解"是一攻击具手段,在web攻击中,一般会使用这种手段对应用系统的认证信息进行获取. 其过程就是使用大量的认证信息在认证接口进行尝试登录,直到得到正确的结果. 为 ...