您的位置:首页 > 其它

inet_ntoa使用时要注意

2011-09-26 17:03 225 查看
in_addr t1,t2;

t1.S_un.S_addr=1;

t2.S_un.S_addr=2;

char *p1=inet_ntoa(t1);

char *p2=inet_ntoa(t2);

这样你只能的得到2个相同的结果

因为它们用的是同一块空间。

解决办法是每次调用后都把值考走

如:

char p1[20]={0};

strcpy(p1,inet_ntoa(t1));

这样处理就没问题了

inet_ntoa函数的问题 (2007-05-10 13:14)

分类: 网络编程

今天在向同学show的时候,发现了了我打印源ip和目的ip都是一样的,晕,幸亏同学都没有发现。

回来当然要改程序了。

inet_ntoa()

简述:

将网络地址转换成“.”点隔的字符串格式。

char * inet_ntoa( struct in_addr in);

in:一个表示Internet主机地址的结构。

The inet_ntoa() function converts the Internet host address in given in network byte order to a string in standard

numbers-and-dots notation. The string is returned in a statically allocated buffer, which subsequent calls will

overwrite.

返回值:

若无错误发生,inet_ntoa()返回一个字符指针。否则的话,返回NVLL。其中的数据应在下一个WINDOWS套接口调用前复制出来。

参见:

inet_addr().

测试代码如下

include <stdio.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <string.h>

int main(int aargc, char* argv[])

{

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里面的可变参数的求值是从右到左的,仅此而已。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: