【发布时间】:2019-02-26 09:33:26
【问题描述】:
您好,我正在尝试在我的服务器和我的客户端应用程序之间创建一个简单的用户名/密码读写。目前我的客户端运行良好。我遇到的问题在我的服务器端。当我在客户端输入用户名时,它会被我的服务器正确捕获。见以下代码:
void authenticate_process(int cli_sockfd){
/* Authentication Process */
write(cli_sockfd, "USN", 3);
char *username;
username = recv_msg(cli_sockfd);
printf("[DEBUG] Client username is %s.\n", username);
write(cli_sockfd, "PSW", 3);
char *password;
password = recv_msg(cli_sockfd);
printf("[DEBUG] Client Password is %s.\n", password);
}
问题是,例如,用户键入“Johnabscaras”作为用户名,然后代码将最后一个“ras”放入密码变量中。我的 recv_msg 函数如下所示:
/* Reads a message from the server socket. */
char *recv_msg(int sockfd)
{
int length;
char *msg;
msg = (char*) malloc (9);
/* All messages are 9 bytes. */
int n = read(sockfd, msg, 9);
return msg;
}
由于用户名和密码永远不会超过 9 个字节,因此为此设置了它。但我发现,在第一次输入用户名时,如果输入超过 9 个字符,多余的字符将被修改为密码变量。如果您键入的字符少于 9 个,则代码会跳过并且密码变量会由于某种原因立即设置为“”。有人可以解释一下并告诉我如何解决这个问题吗?
【问题讨论】:
-
对我来说很有意义,发送了超过 9 个字节,但您只读取了 9 个,其余字节将在下一次读取时返回。也许在读取名称和密码之间尝试 fflush(sockfd)。
-
您看到的是预期的行为——请记住,TCP 实现的是字节流,而不是消息流;也就是说,TCP 不保留消息边界,因此您将始终按照发送的顺序接收发送的字节,但不一定在相同的分组中。对于您的情况,简单的解决方法是修改发送程序以在发送之前截断字符串,使其永远不会超过 9 个字节。
-
这是用户名这是密码,请告诉我这台可怜的电脑怎么可能知道哪个是哪个?