2011-06-29 17 views
3

私は現在スレッドセーフではありませんgethostbynameバージョンは非常に使いやすいです。ホスト名を渡すと、アドレス構造体が返されます。 MT環境のように見えますが、このバージョンはアプリケーションをクラッシュさせて、gethostbyname_rに置き換えようとしています。サンプルの使用法や良いドキュメントをGoogleに読み込むことは非常に困難です。gethostbyname_rをlinuxで使うには

誰でも使ったことがありますか?gethostbyname_r方法?何か案は ?それを使用する方法とエラー条件があればそれを処理する方法。

+0

これについて1つのブログが見つかりましたが、コードは機能していません。 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"); 
} 

EDIT

getaddrinfoです。

+0

ありがとう!ソケット接続コールに渡す必要があるserver_addr.sin_addrを派生させる方法を知っていますか? – harry

+0

@harry私の編集された答えを見てください。あなたが 'getaddrinfo'を得ていない場合(あるいはそれが気に入らない場合)、別の質問をしてください。 – cnicutar

+0

ええ、それは私の問題を解決しました。 – harry

関連する問題