近日写程序,在打印信息的时候调用了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. Context Menu on DataGrid

    应该设置  fitColumns: true 合并表头显示有问题 代码见示例

  2. 第二百六十九天 how can I 坚持

    什么是明事理,搞不懂啊,好烦. 有点像我妈. 为什么突然就想买房了呢,为什么?年龄到了,考虑的东西就不一样了. 哎,不要想太多,睡觉.

  3. homework 08_2 C++11新特性作业之二

    ---恢复内容开始--- 1.使用Lambda表达式计算“hello world!”中字母e和i的数量 下面是代码: #include "stdafx.h" #include< ...

  4. Android实例-获取安卓手机WIFI信息(XE8+小米2)

    结果: 1.必须打开Access wifi state权限,不打开权限会出图二的错误. 相关资料: http://blog.csdn.net/lyf_lyf/article/category/1735 ...

  5. UVA 315 315 - Network(求割点个数)

     Network  A Telephone Line Company (TLC) is establishing a new telephone cable network. They are con ...

  6. RTT操作系统

    http://www.rt-thread.org/官网 RT-Thread RTOS,由国内一些专业开发人员开发.维护.它不仅仅是一款 高效.稳定的实时操作系统内核,也是一套面向嵌入式系统的软件平台, ...

  7. uva 315 Network(无向图求割点)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. Codeforces Round #257 (Div. 1) C. Jzzhu and Apples (素数筛)

    题目链接:http://codeforces.com/problemset/problem/449/C 给你n个数,从1到n.然后从这些数中挑选出不互质的数对最多有多少对. 先是素数筛,显然2的倍数的 ...

  9. 8086、80x86(IA-32)、64(IA-64)位CPU发展

    众所周知,CPU(中央处理单元)是计算机的核心部分,CPU在单位时间内能一次处理的二进制数的位数叫字长,从386.486直到奔腾系列的CPU都是32位,大多数情况32位计算已经能满足现阶段人们的需要. ...

  10. Redis学习_01 windows下的环境搭建

    一.Redis 简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset( ...