我正在尝试使用密码验证客户端,如果客户端输入不同的密码,则应再次要求他重新输入密码 以下是我的服务器代码:
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
有人可以帮助我,我是这个概念的新手
答案 0 :(得分:1)
您没有提供完整的功能:缺少数组和各种变量的定义。 pass
和buf
确实定义了数组吗?
您没有发送'\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';
似乎没用,而且可能存在风险。