我几乎肯定会做一些非常愚蠢的事情,但我已经在这方面工作了一段时间,我无法在任何地方找到解决方案。
基本上我正在制作服务器和客户端,客户端需要向服务器发送用户名和密码。如果我把所有东西都放在main函数中,但是当我尝试将它分隔成单独的函数时,似乎做了一些奇怪的事情,所以我认为我没有正确处理指针。如果我打印测试并且在receiveStringData函数中没有完全从客户端获取字符串,那就是当我尝试在authenticate函数中访问指针时。如果我在authenticate函数中执行以下代码...
char *username = receiveStringData(socket_id);
char *password = receiveStringData(socket_id);
printf("Username: %s", username);
比没有打印。但是,如果我添加一个换行符,它会完美打印......
printf("Username: %s\n", username);
我可以继续谈论这种行为,但是需要一段时间来列出所有内容,我觉得我正在做一些对经验更丰富的人来说非常明显的事情,所以我会在要求时提供更多细节但现在不会打扰。
这是相关的代码片段(这纯粹是服务器编码)......
bool authenticate(int socket_id);
char *receiveStringData(int socket_id);
int main(int argc, char *argv[])
{
bool authenticated = false;
if(!authenticated)
authenticated = authenticate(new_fd);
}
bool authenticate(int socket_id)
{
char *username = receiveStringData(socket_id);
char *password = receiveStringData(socket_id);
char *tempUsername = malloc(sizeof(char) * MAXDATASIZE);
char *tempPassword = malloc(sizeof(char) * MAXDATASIZE);
bool result = false;
//This logic of course only works when we assume the text file is correct as is provided to us
for(int i = 1; i <= userSize; i++)
{
//printf("Test1 ");
int stringPos = 0;
for(int j = 0; j < strlen(users[i]); j++)
{
if (users[i][j] == '\t' || users[i][j] == ' ')
{
stringPos++;
}
else if(stringPos > 0)
{
memcpy(tempUsername, users[i], sizeof(char) * (j - stringPos));
memcpy(tempPassword, users[i] + (sizeof(char) * j), sizeof(char) * strlen(users[i]) - j);
tempUsername[j - stringPos] = '\0';
tempPassword[strlen(users[i]) - j] = '\0';
break;
}
}
//printf("Test ");
if (strcmp(tempUsername, username) == 0 && strcmp(tempPassword, password) == 0)
{
printf("IT WORKED");
result = true;
}
}
free(username);
free(password);
free(tempUsername);
free(tempPassword);
return result;
}
char *receiveStringData(int socket_id)
{
int numbytes;
char *buf = malloc(sizeof(char) * MAXDATASIZE);
if ((numbytes = recv(socket_id, buf, MAXDATASIZE, 0)) == -1)
perror("connect");
buf[numbytes] = '\0';
return buf;
}