循环以获取主机,网络,协议和服务数据库中的多个条目

时间:2018-03-27 15:42:55

标签: c loops segmentation-fault hostent

我很难理解之前的任务。我将使用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 个答案:

答案 0 :(得分:0)

每次调用这四个NULL函数时,它们将返回其数据库的一个条目,直到它们返回end*net()。阅读他们的手册以了解更多信息,例如: getservent(3)。您可能还希望关闭与import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { SpinnerComponent } from './spinner.component'; import { of } from 'rxjs/observable/of'; describe('SpinnerComponent', () => { let component: SpinnerComponent; let fixture: ComponentFixture<SpinnerComponent>; const fakeSpinner = { spinnerState: of({ show: false }), }; beforeEach( async(() => { TestBed.configureTestingModule({ declarations: [SpinnerComponent], providers: [{ provide: SpinnerService, useValue: fakeSpinner }], }).compileComponents(); }), ); beforeEach(() => { fixture = TestBed.createComponent(SpinnerComponent); component = fixture.componentInstance; fixture.detectChanges(); }); it('should set component.visible based on spinnerService state', () => { expect(component.visible).toEqual(false) }); }); 对应的数据库连接。

另请参阅How to loop getprotent() function等相关问题。