如何在linux中使用gethostbyname_r

时间:2011-06-29 08:03:07

标签: c linux sockets network-programming

我目前正在使用非常容易使用的线程不安全的 gethostbyname 版本。您传递主机名,它返回地址结构。看起来在MT环境中,此版本正在崩溃我的应用程序,因此尝试用 gethostbyname_r 替换它。发现很难谷歌样本用法或任何好的文档。

是否有人使用此 gethostbyname_r 方法?有任何想法吗 ?如何使用它以及如何处理它的错误条件。

1 个答案:

答案 0 :(得分:4)

该函数正在使用调用者提供的临时缓冲区。诀窍是处理ERANGE错误。

int rc, err;
char *str_host;
struct hostent hbuf;
struct hostent *result;

while ((rc = gethostbyname_r(str_host, &hbuf, buf, len, &result, &err)) == ERANGE) {
    /* expand buf */
    len *= 2;
    void *tmp = realloc(buf, buflen);
    if (NULL == tmp) {
        free(buf);
        perror("realloc");
    }else{
        buf = tmp;
    }
}

if (0 != rc || NULL == result) {
    perror("gethostbyname");
}

修改

根据最近的评论,我猜你真正想要的是getaddrinfo