2012-03-07 4 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 blÀ3

Код выше в раздвоенной ребенка, чтобы он не остановить весь сценарий, он просто возвращается к родительскому процессу, но ошибки нет (я тестирую возвращаемое значение, в этом случае оно должно быть ERROR_PAR = 1, поэтому должно появиться сообщение об ошибке).

Есть ли что-то не так в том, как я использую эти функции или проблема должна быть где-то еще?

EDIT: Важно проверить возвращаемое значение getaddrinfo перед любыми другими функциями. Поэтому проблема решена.

+0

Вы проверили 'errno', когда функция не удастся? Он должен дать вам код ошибки, который говорит вам, почему он терпит неудачу. –

+1

Кроме того, вы уверены, что первый адрес, возвращенный 'getaddrinfo', является адресом IPv4? –

+0

Ой, как я мог забыть проверить возвращаемое значение getaddrinfo? Я пытаюсь решить это неправильно здесь. Спасибо, проблема «решена»! – milano

ответ

0

Чтобы официально ответить на этот вопрос, обратитесь к руководству:

В случае успеха, inet_ntop() возвращает ненулевой указатель на целевой_адрес. 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; 
    } 
} 
Смежные вопросы