Цикл для получения нескольких записей в базе данных хоста, сети, протокола и сервиса

Мне трудно понять предыдущее задание. Я должен был использовать функции, приведенные в Расширенном программировании Addison-Wesley в тексте третьего издания среды UNIX (глава 16.3.3), для вывода базы данных хоста, сети, протокола и служб на стандартный вывод. Отзыв моего профессора ниже.

Требуется серьезная работа (-40); каждая секция вывода должна содержать (возможно) много записей и должна считываться в цикле неверными номерами портов службы (-5); порт короткий (НЕ int и в сетевом порядке байтов!); он должен быть преобразован с помощью ntohs(3).

Моя проблема заключается в зацикливании программы для получения нескольких записей, так как я не уверен, как это можно сделать, особенно с адресами в h_addr_list, так как я получаю Segfaults, пытающиеся получить доступ к чему-либо после [0]. Цикл имеет какое-либо отношение к значению h_length?

Вот код, представленный для обратной связи выше:

   /*
    * Dawson Binder
    * Assignment 10 - assign10.c
    * displays the host, network, protocol, and services databases. 
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <netdb.h>
    #include <arpa/inet.h>
    int main(int argc, char *argv[])
    {
        char address[36];
        struct hostent *hPtr = gethostent();    // print host name, address type, address length, and the addresses
        struct netent *nPtr = getnetent();
        struct protoent *pPtr = getprotoent();
        struct servent *sPtr = getservent();

        // Host
        printf("\nHost Name: %s\nAddress Type: %d\nAddress Length: %d\n", hPtr->h_name, hPtr->h_addrtype, hPtr->h_length);
        inet_ntop(AF_INET, hPtr->h_addr_list[0], address, 36);
        printf("Address: %s\n", address);
        // end Host

        // Network
        printf("Network Name: %s\nNetwork Number: %u\n", nPtr->n_name, nPtr->n_net);
        // end Network

        //Protocol
        printf("Protocol Name: %s\nProtocol Number: %d\n", pPtr->p_name, pPtr->p_proto);
        //end Protocol

        //Service Database
                printf("Service Database Name: %s\nService Database Port: %d\nServiceDatabase Protocol: %s\n\n", sPtr->s_name, sPtr->s_port, sPtr->s_proto);    
        //end Service Database
        return 0;
    }

1 ответ

Решение

Каждый раз, когда вы звоните эти четыре get*ent() функции, они будут возвращать одну запись своей базы данных, пока они не вернут NULL, Прочитайте их справочную страницу, чтобы узнать больше, например, getservent(3), Вы также можете закрыть соединение с базой данных с их end*net() двойники.

Смотрите также связанные вопросы, такие как Как зациклить функцию getprotent().

Другие вопросы по тегам