Почему 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);
}