2012-03-07 357 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變量包含要解決ADRESS(我的工作簡單的客戶端/服務器的DNS解析器)。如果可以解決,一切正常,但是當URL不能得到解決,我的產量只有

BLA1 bla2 bla3

上面的代碼是派生的子所以它不會停止整個腳本,它只是回到父進程,沒有錯誤(我正在測試返回值,在這種情況下它應該是ERROR_PAR = 1,所以應該出現錯誤信息)。

有什麼錯我使用這些功能或問題一定是別的地方的方式?

編輯:之前的任何其他功能來檢查的getaddrinfo返回值是非常重要的。所以問題解決了。

+0

你檢查'errno'當函數失敗?它應該給你一個錯誤代碼,告訴你爲什麼失敗。 – 2012-03-07 14:34:10

+1

另外,你確定'getaddrinfo'返回的第一個地址是IPv4地址嗎? – 2012-03-07 14:35:35

+0

哦,我怎麼能忘記檢查getaddrinfo的返回值?我試圖在這裏解決它的錯誤方式。謝謝,問題已經解決了! – milano 2012-03-07 14:40:35

回答

0

要正式回答這個問題,查手冊:

成功時,inet_ntop()返回一個非空指針DST。如果出現錯誤,則返回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; 
    } 
}