inet_ntoa重复调用覆盖问题

#include 
#include 
#include 
int inet_aton(const char *cp, struct in_addr *inp);

inet_ntoa将四字节的ip地址转换成字符串风格的ip地址,它转换成功之后返回的是一个C语言的字符指针(字符串的起始地址)。

字符串是需要有空间存放的,这个空间在哪儿呢?

这个inet_ntoa在内部帮我们开辟好了空间,然后把地址再给我们的。

那它申请的内存,是否需要我们手都free掉?

image-20240204161821263这个手册里面说明,这个返回值是一个静态申请的空间,所以这个就不再需要我们手动释放

下面我们来做一个实验:

#include

#include
#include

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重复调用覆盖问题_第1张图片

也就是第二次把第一次给覆盖了。

当多线程竞争式调用时,就会出现异常,这就表明inet_ntoa不是一个线程安全函数

在之后使用转换函数的时候,可以采用

#include 
const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);

这个接口将保存的缓冲区,让我们用户指定去传,就解决了重复调用覆盖的问题。

你可能感兴趣的:(原创,Linux网络编程,c++,linux,网络)