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

时间:2016-01-17 06:08:31

标签: c client-server

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

    while (1) {         
        printf("Expecting the pass\n");
        ret = recv(sock, pass, sizeof(pass), 0);
        if (ret == -1) {
            perror("Error receiving message");
            exit(1);
        } else {
            pass[strlen(pass) - 1] = '\0';
            printf("Password received %s of length %d\n", pass, strlen(pass));
        }
        printf("Received\n");
        if (strcmp("Abhishek", pass) == 0) {
            printf("Password entered is correct\n");
            snprintf(buffer, sizeof(buffer), "CORRECT");
            break;
        } else {
            printf("Incorrect Password %s\n", pass);
            snprintf(buffer, sizeof(buffer), "I");
        }
        printf("SENDING : %s\n",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] = '\0';
        ret = send(sockid, buf, strlen(buf), 0);
        if (ret == -1) {
            perror("Error sending message");
            exit(1);
        } else {
            printf("Password sent\n");
        }
        memset(&buf[0], 0, sizeof(buf));
        ret = recv(sockid, buf, sizeof(buf), 0);
        printf("RECEIVED %s\n", 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

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

1 个答案:

答案 0 :(得分:1)

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

您没有发送'\0'终止符。客户端上收到的消息不会终止。 strlen(pass)调用未定义的行为。不太可能是你的问题的原因,但仍然是一个重要的错误。

当收到完整的消息时,您需要某种协议来确定服务器和客户端。您应该使用'\n'作为消息结束指示符,或者使用'\0'

以下是如何在服务器端强制终止空终止:

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

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

在客户端,buf[ret] = '\0';似乎没用,而且可能存在风险。