Цикл для получения нескольких записей в базе данных хоста, сети, протокола и сервиса
Мне трудно понять предыдущее задание. Я должен был использовать функции, приведенные в Расширенном программировании 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().