1.把ip地址转化为用于网络传输的二进制数值

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

inet_aton() 转换网络主机地址ip(如192.168.1.10)为二进制数值,并存储在struct in_addr结构中,即第二个参数*inp,函数返回非0表示cp主机有地有效,返回0表示主机地址无效。(这个转换完后不能用于网络传输,还需要调用htons或htonl函数才能将主机字节顺序转化为网络字节顺序)

in_addr_t inet_addr(const char *cp);

inet_addr函数转换网络主机地址(如192.168.1.10)为网络字节序二进制值,如果参数char *cp无效,函数返回-1(INADDR_NONE),这个函数在处理地址为255.255.255.255时也返回-1,255.255.255.255是一个有效的地址,不过inet_addr无法处理;

2.将网络传输的二进制数值转化为成点分十进制的ip地址

char *inet_ntoa(struct in_addr in);

inet_ntoa 函数转换网络字节排序的地址为标准的ASCII以点分开的地址,该函数返回指向点分开的字符串地址(如192.168.1.10)的指针,该字符串的空间为静态分配的,这意味着在第二次调用该函数时,上一次调用将会被重写(复盖),所以如果需要保存该串最后复制出来自己管理!

我们如何输出一个点分十进制的IP呢?我们来看看下面的程序:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main()
{   struct in_addr addr1,addr2;   ulong l1,l2;   l1= inet_addr("192.168.0.74");   l2 = inet_addr("211.100.21.179");   memcpy(&addr1, &l1, 4);   memcpy(&addr2, &l2, 4);   printf("%s : %s\n", inet_ntoa(addr1), inet_ntoa(addr2)); //注意这一句的运行结果   printf("%s\n", inet_ntoa(addr1));   printf("%s\n", inet_ntoa(addr2));  return 0;
}

实际运行结果如下: 
192.168.0.74 : 192.168.0.74 //从这里可以看出,printf里的inet_ntoa只运行了一次。

192.168.0.74

211.100.21.179

inet_ntoa返回一个char *,而这个char *的空间是在inet_ntoa里面静态分配的,所以inet_ntoa后面的调用会覆盖上一次的调用。第一句printf的结果只能说明在printf里面的可变参数的求值是从右到左的,仅此而已。

3.新型网路地址转化函数inet_pton和inet_ntop

这两个函数是随IPv6出现的函数,对于IPv4地址和IPv6地址都适用,函数中p和n分别代表表达(presentation)和数值(numeric)。地址的表达格式通常是ASCII字符串,数值格式则是存放到套接字地址结构的二进制值。

#include <arpe/inet.h>
int inet_pton(int family, const char *strptr, void *addrptr);     //将点分十进制的ip地址转化为用于网络传输的数值格式返回值:若成功则为1,若输入不是有效的表达式则为0,若出错则为-1const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len);     //将数值格式转化为点分十进制的ip地址格式返回值:若成功则为指向结构的指针,若出错则为NULL

(1)这两个函数的family参数既可以是AF_INET(ipv4)也可以是AF_INET6(ipv6)。如果,以不被支持的地址族作为family参数,这两个函数都返回一个错误,并将errno置为EAFNOSUPPORT.
(2)第一个函数尝试转换由strptr指针所指向的字符串,并通过addrptr指针存放二进制结果,若成功则返回值为1,否则如果所指定的family而言输入字符串不是有效的表达式格式,那么返回值为0.

(3)inet_ntop进行相反的转换,从数值格式(addrptr)转换到表达式(strptr)。inet_ntop函数的strptr参数不可以是一个空指针。调用者必须为目标存储单元分配内存并指定其大小,调用成功时,这个指针就是该函数的返回值。len参数是目标存储单元的大小,以免该函数溢出其调用者的缓冲区。如果len太小,不足以容纳表达式结果,那么返回一个空指针,并置为errno为ENOSPC。

4.示例

inet_pton(AF_INET, ip, &foo.sin_addr);   //  代替 foo.sin_addr.addr=inet_addr(ip);char str[INET_ADDRSTRLEN];
char *ptr = inet_ntop(AF_INET,&foo.sin_addr, str, sizeof(str));      // 代替 ptr = inet_ntoa(foo.sin_addr)

避免踩坑--网传二进制数值和点分十进制ip之间的转换相关推荐

  1. 二进制与八进制十进制十六进制之间的转换

    目录 1. 计算机中数据存储的分类 2.        数值型数据的存储 2.1          十进制 2.2          二进制 2.3          八进制 2.4         ...

  2. MoviePy使用GPU加速-踩坑前传

    之前其实就已经讲过了,MoviePy的性能提升,依赖于ffmpeg的性能提升,换句话说: [MoviePy的GPU加速] = [ffmpeg的GPU加速] ffmpeg使用GPU加速,很多大佬都提到过 ...

  3. OrangePi PC 玩Linux主线内核踩坑之旅(三)之设置静态IP地址

    有了前文的基础,我们已经可以通过网络远程连接到香橙派了.但是香橙派的IP地址是通过DHCP获取的,说不定哪天就变了,我们需要对其设置静态IP地址,方便日后操作.先SSH连接到香橙派,编辑/etc/ne ...

  4. JavaScript 进行数值与对应的 ASCII 字符之间的转换【from​Char​Code、from​Code​Point、charCodeAt、code​PointAt】

    引言: 今天遇到一个需求,需要动态创建一个 JS 对象数组,对象中的 key 值并不都是一样的(准确说是一个有序的字母),具体如下: var options = [{"A":&qu ...

  5. 计算机硬盘盒,避免踩坑,如何挑选适合自己电脑的硬盘盒?

    原标题:避免踩坑,如何挑选适合自己电脑的硬盘盒? 前几天飚妹儿发布了一篇文章 <旧电脑别急着扔一个硬盘盒就能让它变废为宝> 简单介绍了下硬盘盒的好处 但也有细心的小伙伴提出了一些疑问 比如 ...

  6. PAT乙级题库踩坑实录

    PAT乙级题库踩坑实录 [截止2021.7.28乙级题库已经全部AC] 题目名称: 1030 完美数列 (25 分) 测试点3踩坑 每次取m后,不用从m后第一个元素开始判断是否大于mp,直接从m后第m ...

  7. 计算机二进制转化教案及ppt,二进制和十进制之间的转换.ppt

    <二进制和十进制之间的转换.ppt>由会员分享,提供在线免费全文阅读可下载,此文档格式为ppt,更多相关<二进制和十进制之间的转换.ppt>文档请在天天文库搜索. 1.计算机中 ...

  8. Smb协议实现内网共享目录文件处理及踩坑记录

    Smb协议实现内网共享目录文件处理及踩坑记录 一.业务场景 公司内网环境,有部分比较古老的业务数据保存在一台windows服务器的共享目录里面.现在需要操作这个windows服务器的共享目录来上传下载 ...

  9. WangEditor富文本编辑器图片上传踩坑之路

    最近由于业务需求,需要用到富文本编辑器,找寻了好久,起初想使用百度的ueditor,但在使用的过程中实在是遇到了太多的坑,于是另外锁定了一款富文本编辑器--wangEditor.这是一款轻量级的富文本 ...

  10. Egg整合antd文件上传以及防踩坑指南

    Egg整合antd文件上传以及防踩坑指南 前言 一. 项目编写 二. 注意事项 2.1 清理缓存 2.2 antd的Upload组件得到的事件对象问题 2.3 关于onChange事件的注意 前言 最 ...

最新文章

  1. spring入门(二) 使用注解代替xml配置
  2. jndi mysql数据库_数据库连接池技术中dbcp、c3p0、jndi
  3. wamp+多版本mysql_WampServer下安装多个版本的PHP、mysql、apache图文教程,_PHP教程
  4. System.out.print实现原理猜解
  5. 小一爬取了 14455 个已发行基金,到底能分析点啥出来?
  6. python处理照片_有趣的Python图片处理
  7. BTC 重现“自由落体”式暴跌,原来是受这几个因素影响?
  8. efficientnet-yolo3-tf2的实现
  9. Hyperledger Fabric CA中文文档
  10. Java获取四分位数
  11. L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误
  12. 未来计算机的图片大全集,小学生未来的机器人儿童画图片大全
  13. Unity序列帧动画疑难解答
  14. LCS(longest common sequence)算法的实现(十分详细)
  15. 计算思维与数据科学 K-Means聚类模型信用卡用户风险评估 python连接数据库来处理数据
  16. 语文课内外杂志语文课内外杂志社语文课内外杂志社2022年第14期目录
  17. 解决:Cause: java.sql.SQLException: Field ‘id‘ doesn‘t have a default value
  18. python闭包和装饰器的区别_python中闭包和装饰器的理解(关于python中闭包和装饰器解释最好的文章)。(转)...
  19. 无法超越,1994 电影史上的巅峰
  20. element message box 确认消息,怎么改变确定和取消的位置?

热门文章

  1. 加班熬夜一个月,终于把所有Python库整理齐了,祝你早日学成
  2. FileZilla Server与FileZilla Client
  3. android 模拟点击屏幕,按键精灵后台简明教程(后台找色,后台鼠标点击等)
  4. eclipse换炫酷主题
  5. lua redisson执行lua脚本
  6. 中国省份城市数据库表
  7. python有什么游戏可以开发智力_用Python解“智力游戏”,你智商够吗?
  8. LoadRunner压力测试:测试报告结果分析
  9. python实现文字转语音播报
  10. 计算机有残留office,电脑残留Office无法重装?电脑完全卸载Office方法