C语言 使用缓冲的put和get,确保客户端在阻塞调用之前获得所需的信息

jk9hmnmh  于 2023-04-11  发布在  其他
关注(0)|答案(1)|浏览(147)

我有一个简单的服务器和客户端的设置,使用TCP。该程序由一个客户端组成,要求用户将一个单词写入stdin。客户端然后读取输入,并将其发送到服务器以计算该字符串的长度。然后将长度返回给客户端,以在stdout中打印出来给用户。
我遇到的问题是,在服务器计算长度并将其发送回客户端之后,客户端被fgets调用卡住,并且不读取服务器放入的任何新信息。只有在服务器退出之后,客户端才能够获得放入文件中的信息并将其打印给用户。
下面是我的服务器代码段,它处理socket中的缓冲输入:

for (;;){
            if ((newSocketFD = accept(socketFD, NULL, NULL)) == -1){
                    perror("error occured while accepting");
                    continue;
            }
            printf("Accepted new connection\n");
            if (fork() == 0){
                    FILE *fp;
                    if ((fp = fdopen(newSocketFD, "r+")) == NULL){
                            perror("error opening file");
                            close(newSocketFD);
                            exit(1);
                    }
                    char *buffer;
                    buffer = (char *)malloc(sizeof(char)*1024);
                    while(fgets(buffer, 1024, fp) != NULL){
                            printf("server: string gotten - %s", buffer);
                            sprintf(buffer, "%ld", strlen(buffer)-1);
                            printf("the buffer is: %s\n", buffer);
                            fputs(buffer, fp); // client can't get any info from this command
                            fflush(fp);
                    }
                    free(buffer);
                    close(newSocketFD);
                    exit(0);
            }
    }

下面是我的客户端代码段,它处理从stdin阅读字符串并将其发送到服务器:

char * buffer = malloc(sizeof(char)*1024);
    for (;;){
            printf("Please enter a string:\n");
            if(fgets(buffer, sizeof(buffer), stdin) == NULL){
                    perror("reading string from stdin failed");
                    continue;
            }

            if(!(fputs(buffer, fp) > 0)){
                    perror("fput command failed");
                    continue;
            }
            fflush(fp);
            // client is stuck on the following line until the server exits
            if(fgets(buffer, 1024, fp) == NULL){
                    perror("error getting length of string. server not working.");
                    fclose(fp);
                    close(socketFD);
                    exit(1);
            }
            printf("The size of the string that was typed is: %d\n", atoi(buffer));
            fflush(stdout);
    }

我还是一个C的初学者,所以这对我来说主要是练习套接字。但我会感谢任何关于代码的建议。谢谢!

dly7yett

dly7yett1#

客户端在阅读用户的输入时使用sizeof(buffer),但buffer是一个char*指针,因此您指定了错误的缓冲区大小,因此没有读取完整的输入,包括服务器对fgets()的调用将查找以停止其读取的\n
更改此:
fgets(buffer, sizeof(buffer), stdin)
对此:
fgets(buffer, 1024, stdin)
此外,服务器在其响应中没有发送\n,客户端对fgets()的调用将查找该响应以停止其阅读。
更改此:
sprintf(buffer, "%ld", strlen(buffer)-1);
对此:
sprintf(buffer, "%ld\n", strlen(buffer)-1);

相关问题