TCP接收问题

时间:2014-11-21 20:33:51

标签: c input tcp

我正在向服务器"发送一些数据。来自客户。这只是一个tcp连接,所以一旦连接,流就会打开,直到我关闭它。无论如何,我发送一个用户名到服务器。服务器测试这是否是有效的用户名,然后发回消息成功或失败。如果它不是有效的用户名,则服务器会重新启动,并且客户端会重新请求用户名再次进行测试,直到您成功登录为止。我遇到的问题是如果我输入了错误的用户名,它会正确地发送回复并要求我重新发送新的用户名。但是,当我现在输入正确的用户名时,它会失败。然后无论它下次发送什么,它都会成功,因为我之前发过它但它就像等待我再次进入。有谁知道如何解决这个问题?我是C.的新手。我尝试在每次循环后重置所有变量,但它仍然无法正常工作。 (是的,我知道UDP是这个任务更好的选择..........它的部分规范)这里是服务器循环

int loggedIn = 0;
    char username[MAX];
    char status[10];
    int statusLen=0;
    int counter = 1;
    while(!loggedIn){
        // receive username
        counter = recv(clientSock, username, MAX - 1, 0);
        username[counter] = '\0';
        printf("%s\n", username);

        // check if username is in list
        //if in the list, send success
        if(strcmp(username,"test1234") == 0){
            strcpy(status,"success");
            statusLen = sizeof(status);
            send(clientSock, status, statusLen,0);
            loggedIn = 1;
        }else { //if not in the list, send error and recv again
            strcpy(status,"fail");
            statusLen = sizeof(status);
            send(clientSock, status, statusLen,0);
            memset(status,0,statusLen);
        }
    }
    printf("YOU MADE IT FINALLY BUDDY\n");
    //send accounts

这是客户端循环

char username[20];
        //verify login
        int loggedIn = 0;
        int counter = 0;
        char status[10];
        while(!loggedIn){
            printf("Please login with your username: \n");
             scanf(" %s",username);
            //send username to the server
            int usernameLen = strlen(username);
            send(serverSock, username, usernameLen,0);
            //recieve from the server
            counter = recv(serverSock, status, 9, 0);
            status[counter] = '\0';
            //if success
            if(strcmp(status, "success") ==0){
                loggedIn = 1;
            } else {//else reenter the username
                printf("Error: Invalid Username!\n");
                memset(username,0,sizeof(username));
                memset(status,0,sizeof(status));
                counter = 0;
            }   
        }

1 个答案:

答案 0 :(得分:1)

发送的字符串大小可以是字符数,而不是字符串大小 在代码中:

statusLen = sizeof(status);  
你可以做

statusLen = strlen(status);  

因为strlen计算字符数,而不是字符串的大小。字符串内存大小和字符数在C中不一定相同 您可以使用gets而不是scanf来阅读字符串 scanf每次找到空格时都会中断字符串 MAX多少钱?查看缓冲区是否足以适合收到的数据 另外,使用printf查看您是否收到了正确的数据。我不确定,但看起来你也在开发服务器 希望这可以帮助。我的代码中找不到任何其他错误。