2012-03-07 362 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; 
    } 
}