gpt4 book ai didi

c - C语言客户端服务器模型中的密码认证

转载 作者:行者123 更新时间:2023-11-30 15:13:06 25 4
gpt4 key购买 nike

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

    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

有人可以帮助我吗,我对这个概念很陌生

最佳答案

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

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

您需要某种协议(protocol)来确定服务器和客户端何时收到完整消息。您应该使用 '\n' 作为消息结束指示符,也可以使用 '\0'

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

    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);
}

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

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

关于c - C语言客户端服务器模型中的密码认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34835655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com