在TCP客户端中取消引用指向不完整类型的指针? (C)

时间:2014-12-14 14:40:07

标签: c sockets tcp client-server

我试图在C中创建一个服务器和一个客户端(TCP),它将作为一个简单的聊天系统。我对这些事情知之甚少,并且引用了this server examplethis client example

注意:我将bzero()和bcopy()更改为memset()和memcpy(),正如我的有限研究所示,但在这两种情况下都出现了错误。除此之外,我自己的客户端仅在链接示例的格式和输出方面有所不同。

    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent * server;

    char buffer[256];

    if (argc < 3) {
        fprintf(stderr,"usage %s hostname port\n", argv[0]);
        exit(0);
    }

    portno = atoi(argv[2]);

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    if (sockfd < 0)  { perror("failed_socket_open"); exit(1); }

    server = (struct hostent *)gethostbyname(argv[1]);

    if (server == NULL) {
        fprintf(stderr,"host isn't real, everything is a lie\n");
        exit(0);
    }

    memset((char *) &serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    memcpy( (char*)server->h_addr,(char*) &serv_addr.sin_addr.s_addr, server->h_length );

这一行(37):

memcpy( (char*)server->h_addr, (char*)&serv_addr.sin_addr.s_addr, server->h_length );

我被告知:

client.c:37: error: dereferencing pointer to incomplete type
client.c:37: error: dereferencing pointer to incomplete type

看来这是因为没有足够的信息来说明服务器 - > h_length应该提供的大小。是否有一些图书馆功能缺失,或其他什么?

1 个答案:

答案 0 :(得分:4)

struct hostent的{​​{1}}是server中定义的netdb.h。由于您没有包含此标头,因此在执行server->时您将取消引用指向不完整类型的指针。