`gethostbyname`如何在不要求调用者释放资源的情况下返回`struct hostent*`?

q09*_*987 9 c network-programming

struct hostent *gethostbyname(const char *name)
Run Code Online (Sandbox Code Playgroud)

请注意,hostent.h_addr_list是一个变量长度的字段.

函数如何gethostbyname具有返回指向结构的指针但不需要调用者释放资源的实现?

R. Stevens着名的书籍Unix Network Programming Vol 1中使用的所有示例都不包含释放这些返回指针的代码,我认为这些不是无知.MSDN中的一个示例也是使用相同的示例

twa*_*erg 5

man您链接的页面包含答案:

当非NULL时,返回值可能指向静态数据,请参阅下面的注释.

过了一会儿:

函数gethostbyname()和gethostbyaddr()可能会返回指向静态数据的指针,这些指针可能会被以后的调用覆盖.


Ste*_*sop 3

假设一个实现想要处理任意大的地址列表,它可以执行如下操作:

struct hostent *gethostbyname(const char *name) {
    static struct hostent *results = 0;
    static size_t resultsize = 0;
    size_t count = get_count_of_addresses(name)
    if (count > resultsize) {
        struct hostent *tmp = realloc(results, N * count + M);
        if (tmp) {
            results = tmp;
            resultsize = count;
        } else {
            // handle error, I can't remember what the docs say
        }
    }
    fill_in_hostent(results, name);
    return results;
};
Run Code Online (Sandbox Code Playgroud)

或者,套接字库可以results在退出时执行一些释放操作(例如安装atexit处理程序),以避免调试工具报告内存泄漏。

我忽略了地址计数在调整结构大小和填充结构之间可能发生变化的可能性——实际上,您会返回 DNS 结果,然后对其进行处理,因此这是不可能的。我将其保留为两个单独的调用,以避免引入 DNS 结果的伪代码表示。