2012-03-07 18 views
0

まず第一に、私のコード例:inet_ntop()のエラーを処理するにはどうすればよいですか?

cout << "bla1" << endl; 
struct addrinfo hints, *info; 
int status; 

memset(&hints, 0, sizeof hints); 

char ip4[INET_ADDRSTRLEN]; 
char ip6[INET6_ADDRSTRLEN]; 

hints.ai_family = AF_INET; 
hints.ai_socktype = SOCK_STREAM; 

cout << "bla2" << endl; 

status = getaddrinfo(url.c_str(), NULL, &hints, &info); 

cout << "bla3" << endl; 

if(!inet_ntop(AF_INET, &((const sockaddr_in *)info->ai_addr)->sin_addr , ip4, INET_ADDRSTRLEN)) { 
    return ERROR_PAR; 
} 

cout << "bla4" << endl; 

url変数は、(私は単純なクライアント/サーバーのDNSリゾルバに取り組んでいる)アドレスが解決されるように含まれています。それが解決できる場合は、すべてが正常に動作し、URLが解決できない場合、それは停止しませんので、しかし、私の出力は

BLA1 BLA2 BLA3

上記のコードは、フォークした子になっていますスクリプト全体、それはちょうど親プロセスに戻りますが、エラーは発生しません(戻り値をテストしています。この場合、ERROR_PAR = 1でエラーメッセージが表示されるはずです)。

これらの機能を使用する方法に問題がありますか、または問題が別の場所にある必要がありますか?

EDIT:他の関数の前にgetaddrinfoの戻り値をチェックすることは重要です。だから問題は解決される。正式には、これを答えるマニュアルを確認するには

+0

を、あなたは '関数が失敗したerrno'を確認しましたか?なぜ失敗するのかを示すエラーコードが表示されます。 –

+1

また、 'getaddrinfo'によって返される最初のアドレスがIPv4アドレスであることを確かめますか? –

+0

ああ、どうすればgetaddrinfoの戻り値をチェックするのを忘れることができますか?私はここでそれを間違って解決しようとしています。ありがとう、問題は "解決"です! – milano

答えて

0

成功した場合、inet_ntop()はdstへの(NULLでない)ポインタを返します。エラーがあった場合はNULLが返され、エラーを示すようにerrnoが設定されます。

だからあなたのようなものだろう:

#include <arpa/inet.h> 
#include <stdio.h>                                                 
#include <string.h> 
#include <errno.h> 

int main(void) { 
    char *ip = "127.0.0.1"; 
    uint32_t src; 
    inet_pton(AF_INET, ip, &src); 

    char dst[INET_ADDRSTRLEN]; 
    if (inet_ntop(AF_INET, &src, dst, INET_ADDRSTRLEN)) { 
     printf("converted value = %s \n", dst); 
     return 0;                                   
    } else { 
     printf("inet_ntop conversion error: %s\n", strerror(errno)); 
     return 1; 
    } 
} 
関連する問題