【问题标题】:TCP receive issueTCP 接收问题
【发布时间】:2014-11-22 05:32:10
【问题描述】:

我正在从客户端向“服务器”发送一些数据。这只是一个 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;
            }   
        }

【问题讨论】:

    标签: c input tcp


    【解决方案1】:

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

    statusLen = sizeof(status);  
    

    你可以这样做

    statusLen = strlen(status);  
    

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

    【讨论】:

    • 感谢您的意见!我会试试这些,让你知道
    • 你是对的!太感谢了。 strlen 是问题所在。由于 scanf,我也在研究标准输入,但这工作得很好..再次感谢您
    • 不客气。我很高兴它有效!并感谢文本格式。我是 stackoverflow 的新手,对这里的文本格式感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多