近日写程序,在打印信息的时候调用了inet_ntoa函数,出现了打印一直出错的情况。google了一下,是因为inet_ntoa这类函数没有保证线程安全,其实现原理是在静态内容中申请一块内存,每次调用后返回该静态内存的指针,若是在同一个printf语句中连续调用两次inet_ntoa函数会导致后调用的覆盖先覆盖的那个。

举个例子(参考了某位前辈的blogs):

 #include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
int main()
{
struct sockaddr_in ra = {};
struct sockaddr_in sa = {};
ra.sin_addr.s_addr = -; //192.168.5.243
sa.sin_addr.s_addr = -; //192.168.5.200
printf("ip of recv:%s\nip of send:%s\n",\
inet_ntoa(ra.sin_addr),inet_ntoa(sa.sin_addr));
printf("ip of send:%s\n",inet_ntoa(sa.sin_addr));
printf("ip of recv:%s\n",inet_ntoa(ra.sin_addr));
}

执行结果:

 [root@host-b lab]# gcc test_ntoa.c
[root@host-b lab]# ./a.out
ip of recv:192.168.5.243
ip of send:192.168.5.243
ip of send:192.168.1.200
ip of recv:192.168.5.243

结果的3、4两行对应code中的11行,结果的5、6两行对用code中的12、13两行,3、4两行的结果明显不正确,原因就是在inet_ntoa(ra.sin_addr)返回的地址将inet_ntoa(sa.sin_addr)的返回地址

连续调用inet_ntoa打印出错的问题的更多相关文章

  1. C/C++捕获段错误,打印出错的具体位置(精确到哪一行)_转

    转自:C/C++捕获段错误,打印出错的具体位置(精确到哪一行) 修订:2013-02-16 其实还可以使用 glibc 的 backtrace_symbols 函数,把栈帧各返回地址里面的数字地址翻译 ...

  2. 连续调用scanf的问题总结

    对于非常简单的scanf函数,一直使用,但是却是有很多的知识点没有掌握好,现总结如下: 1.多个scanf之后,后序以 scanf("%c",&c) 当程序连续调用scan ...

  3. Java jacob调用打印机打印word文档

    前面说了Java如何生成复杂的Word文档,今年记录下Java如何调用打印机打印word文档. 起初用的是自带的PrintJob,但是系统提供的打印机制并不成熟完整.网上的代码也是千篇一律,在我的打印 ...

  4. js调用页面打印

    ----------------------调用页面打印-------------------------------- <body> <div id="divPrint& ...

  5. js调用浏览器打印

    <input type="button" id="print" onclick="printdiv('list');" value=& ...

  6. 利用ManualResetEvent来来控制异步调用的打印的线程的暂停和恢复(转)

    利用ManualResetEvent来来控制异步调用的打印的线程的暂停和恢复 打印过程可能很长,这时候有可能需要暂停下来做一些事情,然后回来继续接着打印 打印过程中有2个线程:一个是程序运行的主线程, ...

  7. paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型

    paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...

  8. php部分--面向对象三大特性-封装(另加连续调用的一个例子)、继承(重写、重载的例子)、多态;

    一.封装性: 目的:为了使类更加安全. 做法:1设置私有成员 2在类中建方法,访问私有成员 3在方法里边加控制(if) 私有成员访问的两种方法: 方法一:set(可写) get(可读)做方法(可读可写 ...

  9. js前台调用lodop打印

    lodop简单介绍 lodop的打印功能已经非常强大,也在带web端的图形界面,可以供用户使用.使用js在前台调用lodop打印,一般分为两种方法: 1:特殊的指令打印,这种打印方式,是采用的与js无 ...

随机推荐

  1. Javascript异步请求你能捕获到异常吗?

    Javascript异步请求你能捕获到异常吗? 异常处理是程序发布之前必须要解决的问题,不经过异常处理的应用会让用户对产品失去信心.在异常处理中,我们一贯的做法是按照函数调用的次序,将异常从数据访问层 ...

  2. 王家林的81门一站式云计算分布式大数据&移动互联网解决方案课程第14门课程:Android软硬整合设计与框架揭秘: HAL&Framework &Native Service &App&HTML5架构设计与实战开发

    掌握Android从底层开发到框架整合技术到上层App开发及HTML5的全部技术: 一次彻底的Android架构.思想和实战技术的洗礼: 彻底掌握Andorid HAL.Android Runtime ...

  3. .NET Reactor 命令行使用

    安装.NET Reactor工具软件.例如你的安装目录为:D:\Program Files\Eziriz\.NET Reactor 按如下步骤设置系统环境变量path. 将path变量的值中加入.NE ...

  4. [转]log4net使用(WinForm/WebFrom)

    原来的一篇文章,今天用 WLW 转到页面上,原文章以及附件下载地址:http://zhq.ahau.edu.cn/blog/article.asp?id=366 http://www.cnblogs. ...

  5. BAT-使用BAT生成快捷方式

    @( echo [InternetShortcut] echo URL=C:\Windows\System32\calc.exe echo IconIndex=0 echo IconFile=C:\W ...

  6. Linux上svn服务器的搭建

    安装svn服务器 直接用yum安装,命令如下: #yum install -y subversion 验证是否安装成功. #svnserve --version 创建SVN版本库 在home目录下创建 ...

  7. Labview中创建属性节点和调用节点的用法

    创建属性节点 个人感觉有点像C中的指针 创建调用节点

  8. eclipse中的js文件报错的解决办法

    在使用别人的项目的时候,导入到eclipse中发现js文件报错,解决办法是关闭eclipse的js校验功能. 三个步骤: 1. 右键点击项目->properties->Validation ...

  9. UI进阶 SQLite错误码

    #define SQLITE_OK 0 /* 成功 | Successful result */ /* 错误码开始 */ #define SQLITE_ERROR 1 /* SQL错误 或 丢失数据库 ...

  10. exit和_exit的区别

    参考 http://www.cnblogs.com/hnrainll/archive/2011/08/17/2142001.html p.p1 { margin: 0.0px 0.0px 0.0px ...