Как справиться с ошибкой inet_ntop ()? - PullRequest
0 голосов
/ 07 марта 2012

Прежде всего, мой пример кода:

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, поэтому должно появиться сообщение об ошибке).

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

РЕДАКТИРОВАТЬ: Важно проверить возвращаемое значение getaddrinfo перед любыми другими функциями.Так что проблема решена.

1 Ответ

0 голосов
/ 12 ноября 2017

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

В случае успеха 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;
    }
}
...