前一阵搞了点在网络上面的编程,出了一些小问题,现在记录一下吧。
inet_ntoa()这个函数是用于把以二进制四字节形式的数据转化成为我们通常见到的用分隔符隔成4段的IP地址,但是不知道大家在使用的过程中是否发现,如果调用print函数同时打印源地址和目的地址的时候,通常打印出来的地址数据是一致的,导师告诉我说不要把打印的数据在一个print中操作就可以避免,实证的结构的确如此,后来自己查看了一些资料,总算有点明白了,先贴出这个函数的标准调用:
NAME
inet_ntoa
SYNOPSIS
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
char *inet_ntoa(struct in_addr in);
我们首先来查看<netinet/in.h>这个头文件,这个里面定义了保存IP地址的数据结构,如下所示:
typedef uint32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
}//设计成为结构体是为了以后的功能扩展
然后是函数的声明,我们可以看到该函数返回了一个char *的指针,也就是该函数转化生成的地址字符串数据的首指针。如果现在做以下的测试,会得到什么结果呢?
struct in_addr s_addr,d_addr;
printf("Source_addr : %s/n Dest_addr:%s/n",inet_ntoa(s_addr),inet_ntoa(d_addr));
你会发现打印在终端上面的都是源地址,而且你查看传进去的二进制数据的确是区别的二进制的源地址和目的地址,那么问题自然就出在了inet_ntoa()上面了。
原来inet_ntoa()返回的是一个static char[]的指针,在printf函数首先调用inet_ntoa(d_addr)获得了目的地址的IP数据的首指针地址,紧接着又调用了inet_ntoa(s_addr)获得了源地址的IP数据的首指针地址,而这两个指针的地址显然是同一个地址,后面获得源地址数据自然就覆盖了目的地址的数据,所以输出了两个相同的数据。