Почему getaddrinfo() всегда вызывает ошибку сегментации?

#include <string.h>
#include <stdio.h>
#include <netdb.h>

int main(){
    char buff[50];
    char port[5];

    printf("Enter address to lookup: ");
    fgets(buff, 50, stdin);

    printf("Enter Port: ");
    fgets(port, 5, stdin);

    struct addrinfo* res;
    struct addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_flags= AI_PASSIVE;

    __auto_type error = getaddrinfo(buff, port, &hints, &res);
    if (error < 0 )
        return 4;

    printf("Host IP: %s", buff);
    error = getnameinfo(res->ai_addr, res->ai_addrlen, buff, 50, 0, 0, 0);
    if (error < 0)
        return 5;

    printf("Host IP: %s", buff);
    freeaddrinfo(res);
}

Выполнение этого кода Заставляет getaddrinfo () завершить программу из-за ошибки сегментации. Изменить: ошибка, похоже, возникает из getaddrinfo () после проверки возвращаемого значенияgetaddrinfoввод просто http://www.google.com/ (также были протестированы несколько других адресов) 443 (также пробовал с портом 80)

1 ответ

Решение

Когда я запускаю ваш исходный код, я получаю res значение 0x1.

Проблема в том, что buff а также port строки имеют новую строку (\n) в них.

Когда новые строки удаляются, он выполняется до завершения.

Вот модифицированный код, который я использовал:

#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <netdb.h>

void
fixup(char *buf)
{
    char *cp;

    cp = strchr(buf,'\n');
    if (cp != NULL)
        *cp = 0;
}

int
main()
{
    char buff[50];
    char port[5];

#if 1
    FILE *xf = stdin;
#else
    FILE *xf = fopen("input.txt","r");
#endif

    printf("Enter address to lookup: ");
    fgets(buff, 50, xf);
    fixup(buff);

    printf("Enter Port: ");
    fgets(port, 5, xf);
    fixup(port);

    struct addrinfo *res;
    struct addrinfo hints;

    memset(&hints, 0, sizeof(hints));
    hints.ai_flags = AI_ALL;

    getaddrinfo(buff, port, &hints, &res);
    printf("res=%p\n",res);
    printf("Host IP: %s\n", buff);

    getnameinfo(res->ai_addr, res->ai_addrlen, buff, 50, 0, 0, NI_NUMERICHOST);
    printf("Host IP: %s\n", buff);

    freeaddrinfo(res);
}
Другие вопросы по тегам