Получить список всех ipv4 и ipv6 под тем же именем хоста - PullRequest
0 голосов
/ 24 апреля 2019

Предположим, у меня есть записи в / etc / hosts, такие как:

10.10.64.225 HostName1

10.10.64.226 HostName1

10.10.64.227 HostName1

FE80: 0000: 0000: 0000: 0202: B3FF: FE1E: 8329 HostName1

2001: 0db8: 85a3: 0000: 0000: 8a2e: 0370: 7334 HostName1

Теперь я хочу получить список всех IP-адресов под тем же именем хоста.

Я использую функцию getaddrinfo.

файл test.c:

#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    struct addrinfo hints, *list, *curr;
    int arg, errcode;

    if (argc < 2 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) {
        fprintf(stderr, "\n");
        fprintf(stderr, "Usage: %s [ -h | --help ]\n", argv[0]);
        fprintf(stderr, "       %s HOSTNAME ...\n", argv[0]);
        fprintf(stderr, "\n");
        return EXIT_FAILURE;
    }

    for (arg = 1; arg < argc; arg++) {

        memset(&hints, 0, sizeof (hints));
        hints.ai_family = PF_UNSPEC;
        hints.ai_socktype = SOCK_STREAM;

        errcode = getaddrinfo(argv[arg], NULL, &hints, &list);
        if (errcode) {
            fprintf(stderr, "%s: %s.\n", argv[arg], gai_strerror(errcode));
            return EXIT_FAILURE;
        }

        for (curr = list; curr != NULL; curr = curr->ai_next) {
            if (curr->ai_family == AF_INET) {
                char addrbuf[INET_ADDRSTRLEN + 1];
                const char *addr;

                addr = inet_ntop(AF_INET, &(((struct sockaddr_in *)curr->ai_addr)->sin_addr), addrbuf, sizeof addrbuf);
                if (addr == NULL) {
                    fprintf(stderr, "%s: %s.\n", argv[arg], strerror(errno));
                    return EXIT_FAILURE;
                }
                printf("%s: IPv4 = %s\n", argv[arg], addr);

            } else
            if (curr->ai_family == AF_INET6) {
                char addrbuf[INET6_ADDRSTRLEN + 1];
                 const char *addr;

                addr = inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)curr->ai_addr)->sin6_addr), addrbuf, sizeof addrbuf);
                if (addr == NULL) {
                    fprintf(stderr, "%s: %s.\n", argv[arg], strerror(errno));
                    return EXIT_FAILURE;
                }
                printf("%s: IPv6 = %s\n", argv[arg], addr);

            }
        }
        freeaddrinfo(list);
    }
    return EXIT_SUCCESS;
}

Вывод: ./test HostName1

ks1: IPv4 = 10.10.64.225

ks1: IPv6 = FE80: 0000: 0000: 0000: 0202: B3FF: FE1E: 8329

Проблема в коде состоит в том, что он возвращает только первый IPV4 и первый адрес IPV6.и мне нужен список всех IP-адресов под тем же именем хоста.

...