gpt4 book ai didi

c - C 语言的 TCP 代码卡住了

转载 作者:行者123 更新时间:2023-11-30 20:10:37 25 4
gpt4 key购买 nike

这是我的代码在建立tcp连接后的主要部分当用户名正确时,即使密码不正确,程序也可以完美运行......但是在用户名正确的情况下,如果我提供不正确的用户名,输出将没有响应,即通过硬终止完成终止。

userlist.txt 包含:用户名密码

客户端代码

char user[256],pass[256],message[256];
char command[256],resp[256];
start:
printf("Enter username : ");
scanf("%s",user);
write(sockfd,user,strlen(user));
bzero(buffer,256);
read(sockfd,buffer,255);
//username is correct
if(strcmp(buffer,"username correct")==0)
{
printf("Enter password : ");
scanf("%s",pass);
write(sockfd,pass,strlen(pass));
bzero(message,256);
read(sockfd,message,255);
printf("%s",message);
}
else
{
printf("%s",buffer);
}
goto start;

服务器代码

//username and password check
char user[256],pass[256],USER[256],PASS[256];
char command[256],names[256]="";
char temp[256];
int temps=0;
FILE *fp;
start:
fp=fopen("userlist.txt","r");
bzero(user,256);
read(newsockfd,user,255);
for(;fscanf(fp,"%s",USER)!=EOF;)
{
if(strcmp(user,USER)==0)
{
write(newsockfd,"username correct",16);
bzero(pass,256);
read(newsockfd,pass,255);
fscanf(fp,"%s",PASS);
temps=1;
if(strcmp(pass,PASS)==0)
write(newsockfd,"success",7);
else
write(newsockfd,"invalid password ",17);
}
else
{
fscanf(fp,user,PASS);
}
}
if(temps==0)
{
write(newsockfd,"invalid username ",17);
}
fclose(fp);
goto start;

最佳答案

您正在交错文件访问和网络访问。这是一个坏主意。

代码的作用是:

  1. 从网络读取名称:

    read(newsockfd,user,255);
  2. 从文件中读取名称:

    fscanf(fp,"%s",USER)
  3. 然后比较。

  4. 从网络读取密码:

    read(newsockfd,pass,255);
  5. 然后从文件中读取密码:

    fscanf(fp,"%s",PASS);
  6. 然后比较。

在任何时候,您都不会返回到文件的开头。这意味着您最终可能会尝试读取超出文件末尾的内容。

不要混合这些问题(文件访问和网络访问),而是读取名称和密码并存储它们以供将来需要时进行比较。

<小时/>

除此之外,该行:

fscanf(fp,user,PASS);

这是错误的。第二个参数应该是变量user所不代表的format

<小时/>

我知道我没有涵盖所有内容。例如,我们可以讨论如何防止缓冲区溢出,甚至如何正确存储密码。如果我尝试的话,我肯定会错过很多(无论如何,自从我上次使用 C 以来已经很长时间了)。

不过,我还是想提请大家注意这些评论。特别是,如果您还可以带走一件事,那就是检查函数的返回值。

关于c - C 语言的 TCP 代码卡住了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44095284/

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