2016-03-14 37 views
0

我在用C套接字完成我的程序时遇到问题。这是一个基本的“猜数字”游戏。问题是,一旦数字被正确猜测,客户端控制台不会输出任何它应该(“你赢了”和“继续猜测下一个数字”)。从Client.c多用户用套接字猜数字游戏,使用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

printf(“Serveris:%s \ n”,buffer)的输出是什么?偶然的缓冲区是否包含换行符?尝试printf(“Serveris:**%s ** \ n”,缓冲区),以便知道如果从服务器发送的任何内容到达客户端,您测试的缓冲区 –

+0

的确切内容是什么? – knightrider

+0

什么是recv_line?和send_line。你使用调试器来观察发生了什么? – pm100

回答

0

字符串“数字太大”或“数字太小”在需要时被正确打印出来,所有失败的数字都会被正确猜测 - >字符串“宾果!从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是线 - 缓冲的。简单地说,这意味着数据保留在内部缓冲区中,直到打印换行符为止。所以​​(没有换行符)字符串是打印,但不是刷新,直到printf("Server: %s\n",buffer)提供换行符。

更改printf("You won!!")printf("You won!!\n")或之后拨打fflush(stdout)

+0

Holy smoke!较新的认为这个细节会产生这样的差异......非常感谢你! – Pa2k3l1s