使用C,多用户使用套接字“猜数字”游戏

时间:2016-03-14 22:49:23

标签: c sockets

我在使用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';    
}

如果用户猜对了,我怎样才能完成这项工作?

1 个答案:

答案 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)