2011-06-29 23 views
3
我目前使用的線程不安全 的gethostbyname版本,這是非常容易使用

使用gethostbyname_r。您傳遞主機名稱並返回地址結構。看起來像MT的環境中,這個版本是我的崩潰使應用程序試圖與gethostbyname_r來取代它。谷歌很難找到一個示例用法或任何好的文檔。如何在Linux

有沒有人用這個gethostbyname_r方法?有任何想法嗎 ?如何使用它以及如何處理它的錯誤情況(如果有的話)。

+0

找到一個博客這個,但代碼是行不通的。 http://dimitry-i.blogspot.com/2010/09/how-to-use-gethostbynamer-correct.html – harry

回答

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

+0

謝謝!你知道如何派生server_addr.sin_addr,我需要傳遞給套接字連接調用嗎? – harry

+0

@harry請參閱我編輯的答案。如果你沒有得到'getaddrinfo'(或者不喜歡它)請問另一個問題。 – cnicutar

+0

是的,這解決了我的問題。 – harry