我正在向服务器"发送一些数据。来自客户。这只是一个tcp连接,所以一旦连接,流就会打开,直到我关闭它。无论如何,我发送一个用户名到服务器。服务器测试这是否是有效的用户名,然后发回消息成功或失败。如果它不是有效的用户名,则服务器会重新启动,并且客户端会重新请求用户名再次进行测试,直到您成功登录为止。我遇到的问题是如果我输入了错误的用户名,它会正确地发送回复并要求我重新发送新的用户名。但是,当我现在输入正确的用户名时,它会失败。然后无论它下次发送什么,它都会成功,因为我之前发过它但它就像等待我再次进入。有谁知道如何解决这个问题?我是C.的新手。我尝试在每次循环后重置所有变量,但它仍然无法正常工作。 (是的,我知道UDP是这个任务更好的选择..........它的部分规范)这里是服务器循环
int loggedIn = 0;
char username[MAX];
char status[10];
int statusLen=0;
int counter = 1;
while(!loggedIn){
// receive username
counter = recv(clientSock, username, MAX - 1, 0);
username[counter] = '\0';
printf("%s\n", username);
// check if username is in list
//if in the list, send success
if(strcmp(username,"test1234") == 0){
strcpy(status,"success");
statusLen = sizeof(status);
send(clientSock, status, statusLen,0);
loggedIn = 1;
}else { //if not in the list, send error and recv again
strcpy(status,"fail");
statusLen = sizeof(status);
send(clientSock, status, statusLen,0);
memset(status,0,statusLen);
}
}
printf("YOU MADE IT FINALLY BUDDY\n");
//send accounts
这是客户端循环
char username[20];
//verify login
int loggedIn = 0;
int counter = 0;
char status[10];
while(!loggedIn){
printf("Please login with your username: \n");
scanf(" %s",username);
//send username to the server
int usernameLen = strlen(username);
send(serverSock, username, usernameLen,0);
//recieve from the server
counter = recv(serverSock, status, 9, 0);
status[counter] = '\0';
//if success
if(strcmp(status, "success") ==0){
loggedIn = 1;
} else {//else reenter the username
printf("Error: Invalid Username!\n");
memset(username,0,sizeof(username));
memset(status,0,sizeof(status));
counter = 0;
}
}
答案 0 :(得分:1)
发送的字符串大小可以是字符数,而不是字符串大小 在代码中:
statusLen = sizeof(status);
你可以做
statusLen = strlen(status);
因为strlen
计算字符数,而不是字符串的大小。字符串内存大小和字符数在C中不一定相同
您可以使用gets
而不是scanf
来阅读字符串
scanf
每次找到空格时都会中断字符串
MAX多少钱?查看缓冲区是否足以适合收到的数据
另外,使用printf查看您是否收到了正确的数据。我不确定,但看起来你也在开发服务器
希望这可以帮助。我的代码中找不到任何其他错误。