C 中的客户端服务器模型中的密码身份验证



我正在尝试使用密码对客户端进行身份验证,如果客户端输入不同的密码,则应再次要求他重新输入密码以下是我的服务器代码:

    while (1) {         
        printf("Expecting the passn");
        ret = recv(sock, pass, sizeof(pass), 0);
        if (ret == -1) {
            perror("Error receiving message");
            exit(1);
        } else {
            pass[strlen(pass) - 1] = '';
            printf("Password received %s of length %dn", pass, strlen(pass));
        }
        printf("Receivedn");
        if (strcmp("Abhishek", pass) == 0) {
            printf("Password entered is correctn");
            snprintf(buffer, sizeof(buffer), "CORRECT");
            break;
        } else {
            printf("Incorrect Password %sn", pass);
            snprintf(buffer, sizeof(buffer), "I");
        }
        printf("SENDING : %sn",buffer);
        ret = send(sock, buffer, strlen(buffer), 0);
        if (ret == -1) {
            perror("Error sending message");
            exit(1);
        }
    }

客户端代码是:

    while (1) {
        printf("Enter the password :");
        fgets(buf, sizeof(buf), stdin);
        buf[ret] = '';
        ret = send(sockid, buf, strlen(buf), 0);
        if (ret == -1) {
            perror("Error sending message");
            exit(1);
        } else {
            printf("Password sentn");
        }
        memset(&buf[0], 0, sizeof(buf));
        ret = recv(sockid, buf, sizeof(buf), 0);
        printf("RECEIVED %sn", buf);
        if (ret == -1) {
            perror("Error receiving message");
            exit(1);
        }
        if (buf[0] != 'I') {
            break;
        }
    }

当我在不同的窗口中执行它们时,我可以在服务器端看到:

Asking for password authentication
Expecting the pass

在客户端:

Start the Admin Dialogue
Enter the password :

现在,当我在客户端窗口中输入密码时,它说:

Password sent

但服务器仍在

Expecting the pass

有人可以帮助我,我是这个概念的新手吗

您没有提供完整的函数:缺少数组和各种变量的定义。passbuf确实定义了数组吗?

您不会发送''终结器。客户端接收的消息不是空终止的。 strlen(pass)调用未定义的行为。 不太可能是导致您问题的原因,但仍然是一个重大错误。

您需要某种协议来确定服务器和客户端中何时收到完整的消息。 您应该使用 'n' 作为消息结束指示器或可能用作''

以下是在服务器端强制空终止的方法:

    printf("Expecting the passn");
    ret = recv(sock, pass, sizeof(pass) - 1, 0);
    if (ret == -1) {
        perror("Error receiving message");
        exit(1);
    } else {
        pass[ret] = '';
        if (ret > 0 && pass[ret - 1] == 'n')
            pass[--ret] = '';
        printf("Password received %s of length %dn", pass, ret);
    }

但这还不足以确保服务器已收到完整的消息,您确实应该接收到,直到获得换行符或某种指示完整消息的协议。

在客户端,buf[ret] = '';似乎毫无用处且存在潜在风险。

最新更新