我很难理解以前的任务。我将使用 Addison-Wesley Advanced Programming in the UNIX Environment第三版文本(第 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;
}