rewind(fp);
struct user t;
while (fread(&t,sizeof(struct user),1,fp) == 1) {
if (strcmp(t.name,me.name) == 0) {
if (strcmp(t.passwd,me.passwd) == 0) {
login(me,sockfd);
return 0;
}
else
return 1;
}
}
return 2;
}
static void login(struct user me,int sockfd) {
FILE *fp;
fp = fopen("login.dat","r+");
if (fp == NULL) {
err_ret("open login.dat error");
return ;
}
else {
struct login_user loguser;
rewind(fp);
while (fread(&loguser,sizeof(struct login_user),1,fp) == 1) {
if (strcmp(me.name,loguser.name) == 0) {
if (loguser.online) {
fprintf(stderr,"user is already online\n");
return;
}
else {
loguser.online = true;
struct sockaddr peeraddr;
socklen_t addrlen;
addrlen = sizeof(peeraddr);
if (getpeername(sockfd,&peeraddr,&addrlen) == -1) {
err_ret("getpeername error");
return;
}
off_t offset;
offset = -sizeof(struct login_user);
loguser.useraddr = peeraddr;
if (fseek(fp,offset,SEEK_CUR) != 0) {
err_ret("seek error");
return;
}
if (fwrite(&loguser,sizeof(loguser),1,fp) != 1) {
err_ret("fwrite error");
return;
}
return;
}
}
}
strcpy(loguser.name,me.name);
loguser.online = true;
socklen_t addrlen;
struct sockaddr peeraddr;
#ifdef DEBUG
fprintf(stderr,"login");
#endif
addrlen = sizeof(peeraddr);
if (getpeername(sockfd,&peeraddr,&addrlen) == -1) {
err_ret("getpeername error");
return;
}
loguser.useraddr = peeraddr;
if (fwrite(&loguser,sizeof(loguser),1,fp) !=1) {
err_ret("fwrite error");
return;
}
if (fp != NULL)
fclose(fp);
return;
}
}
在注册文件中查找用户是否已注册,若否,则登录失败,若是,则核查用户名及密码,若用户名或密码错误,返回,否则查看当前用户是否已登录,若没有,则登录(并记住主机地址),否则,提示主机登录失败。。修改一下可以提示远程主机,但这个只是测试而已。。。。