我有一个简单的服务器和客户端的设置,使用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的初学者,所以这对我来说主要是练习套接字。但我会感谢任何关于代码的建议。谢谢!
1条答案
按热度按时间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);