关于gethostbyname 您所在的位置:网站首页 struct内存泄漏 关于gethostbyname

关于gethostbyname

2024-06-30 17:48| 来源: 网络整理| 查看: 265

int gethostbyname_r(const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop);

为了避开非线程安全的gethostbyname,想用这货,用起来类似这样:

int host2addr(const char *host, struct in_addr *addr) { struct hostent he, *result; int herr, ret, bufsz = 512; char *buff = NULL; do { char *new_buff = (char *)realloc(buff, bufsz); if (new_buff == NULL) { free(buff); return ENOMEM; } buff = new_buff; ret = gethostbyname_r(host, &he, buff, bufsz, &result, &herr); bufsz *= 2; } while (ret == ERANGE); if (ret == 0 && result != NULL) *addr = *(struct in_addr *)he.h_addr; else if (result != &he) ret = herr; free(buff); return ret; }

基本上跟GNU官方文档里的例子一致(GNU的还少了个free的样子)。

但是对hostent还是不太放心:

struct hostent { char *h_name; /* official name of host */ char **h_aliases; /* alias list */ int h_addrtype; /* host address type */ int h_length; /* length of address */ char **h_addr_list; /* list of addresses */ } #define h_addr h_addr_list[0] /* for backward compatibility */

这里面有h_name,h_aliases,h_addr_list ... 我又翻看了下eglibc-2.15的gethostbyname的源码,逻辑基本上跟我上面这段一样。但是,这些东西没释放的话,真的没问题吗?



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有