我在使用C中的套接字完成程序时遇到问题。这是一个基本的'猜数字'游戏。问题是,一旦正确猜出一个数字,客户端控制台就不会输出它应该的任何内容(“你赢了”和“继续猜测下一个数字”)。
来自Client.c
的示例代码:
while (1) {
bzero(buffer,BUF_SIZE);
scanf("%s", &buffer);
send_line(sockfd, buffer);
if (strcmp(buffer, "quit") == 0)
break;
recv_line(sockfd, buffer);
printf("Server: %s\n", buffer);
if (strcmp("Bingo!", buffer) == 0) {
printf("You won!!");
recv_line(sockfd, buffer);
printf("Server: %s\n",buffer);
printf("Keep on guessing next number!\n");
}
}
来自Server.c
的示例代码:
while (1) {
recv_line(new_fd, buffer);
printf("%s\n",buffer);
if (strcmp(buffer, "quit") == 0) {
printf("Client '%s' quit.\n", name);
break;
}
if (atoi(buffer) >lol){
send_line(new_fd,"number too big!");
}
if (atoi(buffer) <lol){
send_line(new_fd,"number too small!");
}
if (lol== atoi(buffer)){
send_line(new_fd, "Bingo!");
printf("Client '%s' guessed correctly!\n ", name);
printf("Enter new number fo user '%s'!\n", name);
scanf("%d", &lol);
send_line(new_fd, "New number generated!");
}
}
}
还:
void send_line(int new_fd, char * buffer) {
int len = strlen(buffer);
if (send(new_fd, buffer, len, 0) == -1) {
perror("send");
exit(1);
}
}
void recv_line(int new_fd, char * buffer){
int len;
if ((len = recv(new_fd, buffer, BUF_SIZE, 0)) == -1){
perror("recv");
exit(1);
} else
buffer[len] = '\0';
}
如果用户猜对了,我怎样才能完成这项工作?
答案 0 :(得分:0)
字符串&#34;数字太大&#34;或&#34;数字太小&#34;当需要和正确地打印出来时,所有失败的是一旦数字被正确猜测 - &gt; string&#34; Bingo!&#34;从Server.c转到Client.c,然后在Server.c中输入新数字之前没有任何反应
这正是客户端的编码方式:
if (strcmp("Bingo!", buffer) == 0) {
printf("You won!!");
recv_line(sockfd, buffer);
printf("Server: %s\n",buffer);
printf("Keep on guessing next number!\n");
}
stdio
是行缓冲的。丢失地说,这意味着数据保留在内部缓冲区中,直到打印换行符。因此You won!!
(没有换行符)字符串打印,但已刷新,直到printf("Server: %s\n",buffer)
提供换行符。
将printf("You won!!")
更改为printf("You won!!\n")
或在其后调用fflush(stdout)
。