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

Working with buffered put and get, ensuring client gets info it needs before blocking call

提问人:ahmed33033 提问时间:4/7/2023 最后编辑:273Kahmed33033 更新时间:4/7/2023 访问量:30

问:

我使用TCP对服务器和客户端进行了简单的设置。 该程序由一个客户端组成,该客户端要求用户将单词写入 stdin。然后,客户端读取输入,并将其发送到服务器以计算该字符串的长度。然后将长度返回给客户端,并在 stdout 中打印给用户。

我遇到的问题是,在服务器计算长度并将其发送回客户端后,客户端卡在 fgets 调用上,并且不会读取服务器放置的任何新信息。只有在服务器退出后,客户端才能获取放入文件的信息并将其打印出来给用户。

这是我的服务器代码的一部分,用于处理套接字中的缓冲输入:

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 的初学者,所以这主要只是练习套接字。但我会很感激有关代码的任何建议。谢谢!

C 套接字 TCP IO

评论


答:

0赞 Remy Lebeau 4/7/2023 #1

客户端在读取用户的输入时正在使用,但是一个指针,因此您指定了错误的缓冲区大小,因此没有读取完整的输入,包括服务器调用将要查找以停止读取的输入。sizeof(buffer)bufferchar*\nfgets()

更改此项:

fgets(buffer, sizeof(buffer), stdin)

对此:

fgets(buffer, 1024, stdin)

此外,服务器不会在其响应中发送 a,客户端的调用将寻找该响应以停止读取。\nfgets()

更改此项:

sprintf(buffer, "%ld", strlen(buffer)-1);

对此:

sprintf(buffer, "%ld\n", strlen(buffer)-1);

评论

0赞 ahmed33033 4/7/2023
OMG 将 \n 添加到 sprintf 解决了这个问题!!!我花了几个小时,但现在它终于起作用了!我知道对此发表评论有点违反规则,但谢谢