#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
inet_ntoa
将四字节的ip
地址转换成字符串风格的ip
地址,它转换成功之后返回的是一个C语言的字符指针(字符串的起始地址)。
字符串是需要有空间存放的,这个空间在哪儿呢?
这个
inet_ntoa
在内部帮我们开辟好了空间,然后把地址再给我们的。那它申请的内存,是否需要我们手都
free
掉?这个手册里面说明,这个返回值是一个静态申请的空间,所以这个就不再需要我们手动释放
下面我们来做一个实验:
#include<iostream>
#include<netinet/in.h>
#include<arpa/inet.h>
int main()
{
struct sockaddr_in addr1;
struct sockaddr_in addr2;
addr1.sin_addr.s_addr = 0;
addr2.sin_addr.s_addr = 0xff;
char *ptr1 = inet_ntoa(addr1.sin_addr);
char *ptr2 = inet_ntoa(addr2.sin_addr);
std::cout << "ptr1:" << ptr1 << std::endl;
std::cout << "ptr2:" << ptr2 << std::endl;
return 0;
}
我们重复连续两次调用这个函数,发现第一次和第二次的结果一样:
也就是第二次把第一次给覆盖了。
当多线程竞争式调用时,就会出现异常,这就表明
inet_ntoa
不是一个线程安全函数
在之后使用转换函数的时候,可以采用
#include <arpa/inet.h>
const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);
这个接口将保存的缓冲区,让我们用户指定去传,就解决了重复调用覆盖的问题。