热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

inet_ntoa()返回字符串的生命周期

在做linux下面的网络编程时写了如下一段程序[cpp:showcolumns]viewplaincopy102030405060708090100110120130140150&

在做linux下面的网络编程时写了如下一段程序

 


[cpp:showcolumns] view plaincopy
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1. //(省去N行……)  
  2. char *source,*dest;  
  3. struct in_addr saddr;  
  4. struct in_addr daddr;  
  5. saddr.s_addr = (in_addr_t)cmd.source.v_uint;  //cmd.source.v_uint装载了由字符串通过inet_aton()转化成的源IP的网络字节,这里无错,不必深究:)   
  6. daddr.s_addr = (in_addr_t)cmd.dest.v_uint;    //同上  
  7.   
  8. source = (char*)inet_ntoa(saddr);  
  9. dest = (char*)inet_ntoa(daddr);  
  10.   
  11. printf(“source[%s]  dest[%s]”,source,dest);  
  12. //(省去N行……)  




执行之后打印结果总是源IP和目的IP一样,如下(程序名为pro):


#./pro -s 192.1.1.1 -d 192.2.2.2


#source[192.2.2.2] dest[192.2.2.2]




 

 

 

 

 

 

 检查了很久都没发现任何错误,最始还以为赋值时不小心把源IP赋成了目的IP,但是事实上编写的时候还是比较细心, 没犯这种错误,呵呵:)。


 

 

 

 

 

 

 最后一步步排查,将saddr.s_addr与daddr.s_addr的数值都打印出来了,发现二者的数值完全不一样,既然它们两不 一样,通过inet_ntoa()返回的字符串也应该不一样,所以,问题就出在了inet_ntoa()的应用上了。man了一下,发现了对inet_ntoa的这么一行说明:

The inet_ntoa() function converts the Internet host address in, given
in network byte order, to a string in IPv4 dotted-decimal notation.
The string is returned in a statically allocated buffer, which subse-
quent calls will overwrite.


       红色字体的意思是inet_ntoa()返回的字符串是临时装在一个静态分配的缓冲区里面,下一次调用此函数的时候缓冲区会被重写 。哈哈,终于发现为什么转化为字符串后,源地址老是与目的地址一样了,关键原因在于指针的使用,前面是将用来装载源地址和目的地址字符串的source与dest声明成了指针,那么,赋值之后二者指针就会都指向inet_ntoa()的临时缓冲区里,在给dest赋值时,缓冲区被重写了,所以source指针的值就变成了目的地址,二者自然就一样了。因此,改成下面的代码就没问题了:

 


[cpp:showcolumns] view plaincopy
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1.    //(依然省去N行……)   
  2.       char source[16],dest[16];   //声明成数组,可以将内容从缓冲区里复制过来,面不是用指针指向缓冲区  
  3. int saddr_len,daddr_len;  
  4. struct in_addr saddr;  
  5. struct in_addr daddr;  
  6.   
  7. saddr.s_addr = (in_addr_t)cmd.source.v_uint;  
  8. daddr.s_addr = (in_addr_t)cmd.dest.v_uint;      
  9. saddr_len = strlen(inet_ntoa(saddr));  
  10. daddr_len = strlen(inet_ntoa(daddr));  
  11.   
  12. if(saddr_len <&#61;15 && daddr_len <&#61;15)     //IP址的字符串最多为15位  
  13.  
  14.     memcpy(source,inet_ntoa(saddr),saddr_len);  
  15.     memcpy(dest,inet_ntoa(daddr),daddr_len);  
  16.     source[saddr_len] &#61; &#39;/0&#39; 
  17.     dest[daddr_len] &#61; &#39;/0&#39; 
  18.   
  19. }else 
  20.     printf("ADDR Error/n");  
  21.     exit(1);  
  22.  
  23. printf(“source[%s]  dest[%s]”,source,dest);  
  24.   
  25. //&#xff08;依然省去N行……&#xff09;  

习惯了用家用电器不看说明书&#xff0d;_-!&#xff0c;看来&#xff0c;以后在使用东西之前还是多看看说明&#xff0c;少走弯路






推荐阅读
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细介绍了VMware的多种认证选项,帮助你根据职业需求和个人技能选择最合适的认证路径,涵盖从基础到高级的不同层次认证。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
author-avatar
手机用户2602931635
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有