LINUX.ORG.RU

getaddrinfo выдает нулевые адреса 0.0.0.0

 ,


0

1

вот программа, вроде делал по example из мануала, но выдает какие-то нулевые адреса, посмотрите пожалуйста, в чем проблема:

cat resolver.c 
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <ctype.h>
#include <linux/in.h>
#include <sysexits.h>

#define DNS_FILE_NAME ./dnsseeds.conf
#define LEN_OF_DNS 250
#define xstr(s) str(s)
#define str(s) #s

typedef struct stuffs_s stuffs_t;
struct stuffs_s {
	char *line;
};

void trim_comments(char *);
void free_stuffs(stuffs_t *);
void trim_spaces(char *);

int EF_ALIGNMENT = 0;
int EF_PROTECT_FREE = 1;

int main(void)
{
	int ret;
	size_t len = LEN_OF_DNS;
	ssize_t n;
	FILE *seeds;
	struct addrinfo hints, *res, *next;
	stuffs_t *stuffs;
	if ((stuffs = calloc(1, sizeof(stuffs_t))) == NULL) {
		perror("calloc");
		exit(EX__BASE);
	}
	if ((stuffs->line = malloc(sizeof(char) * LEN_OF_DNS)) == NULL) {
		perror("malloc");
		free_stuffs(stuffs);
		exit(EX__BASE);
	}
	if ((seeds = fopen(xstr(DNS_FILE_NAME), "r")) == NULL) {
		perror("fopen");
		free_stuffs(stuffs);
		exit(EX__BASE);
	}
	while ((n = getline(&stuffs->line, &len, seeds)) != -1) {
		*(stuffs->line + n - 1) = '\0';
		trim_comments(stuffs->line);
		if (*stuffs->line == '\0')
			continue;
		printf("name is: %s\n", stuffs->line);
		memset(&hints, 0, sizeof(struct addrinfo));
		hints.ai_flags = AI_PASSIVE;
		hints.ai_socktype = SOCK_DGRAM;
		hints.ai_family = AF_UNSPEC;
		if ((ret = getaddrinfo(stuffs->line, NULL, &hints, &res)) != 0) {
			fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret));
			free_stuffs(stuffs);
			exit(EX__BASE);
		}
		for(next = res; next != NULL; next = next->ai_next) {
			printf("%s ", inet_ntoa(((struct sockaddr_in *)next->ai_addr)->sin_addr));
			printf("\n");
		}
		printf("\n");
		freeaddrinfo(res);
	}
	fclose(seeds);
	free_stuffs(stuffs);
	exit(EX_OK);
}

void free_stuffs(stuffs_t *stuffs)
{
	if (stuffs)
		free(stuffs);
}

void trim_spaces(char *line)
{
	while (*line)
		if (isspace(*line))
			memmove(line, line + 1, strlen(line));
		else
			line++;
}

void trim_comments(char *line)
{
	char *ind;
	trim_spaces(line);
	ind = index(line, '#');
	if (ind)
		*ind = '\0';
}

вот файл dnsseeds.conf

google.com

вот такой вывод программы получаю:

$ ./a.out 
name is: google.com
142.251.36.46 
0.0.0.0 

откуда берется 0.0.0.0, подскажите пожалуйста

★★★

может ipv6? Если ты явно не запросил выдавать только ipv4, то записи с ipv6 адресами тоже могут вернуться

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

возможно, щас посмотрю, спасибо за наводку

IvanR ★★★
() автор топика

«int EF_ALIGNMENT = 0;» - это лишнее, включая если И в теле функции статистическая переменная определена, обнулять их не надо, из-за того, что Они изначально пустые. Вот поэтому вас дрючат в универах по-ассемблеру.

anonymous
()
Ответ на: комментарий от anonymous

да, действительно, но лучше явно указать значение переменной

IvanR ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.