实现的功能
注册
登录
查询单词
查询历史记录
大概思路
搭建tcp服务器,通过IO多路复用实现并发(伪并发)。注册:接收到客户端发来的数据,建立一张用户表,将注册信息存储到数据库的用户表中,不过存入之前要判断是否重名 数据可以是一个结构体 可以设置结构中的一个成员为客户端发送过来的指令 客户端根据指令判断是注册 登录 等等。登录同理,不过这时候服务器对数据库表的操作为查询,有注册成功 没有则做其他处理。登录成功后修改登录状态为在线 这个标志位同样存储在结构体中。查询单词 历史记录等同样是对数据库进行查找、插入操作等 这里就不作过多赘述。
下面直接将这个练手的小项目的详细代码分享给大家 希望能帮助到刚入门的你 博客写的不是很规范将就看看吧 内容中若有错误的地方还请指正
定义的结构体:
typedef struct message_user{
char name[20];
char passwd[20];
char wordname[20];
char meaning[128];
int flags;//判断发送的指令
int states;//用户是否在线
int ifuser;//用户名是否存在
int loginflags;// 1成功 2 密码错误 3 用户名不存在
int ifinsearch;//是否查找到对应单词 0没有 1查到
int histroyflags;//1 byuser 2 bywordname
char result[48][128];//历史记录
int num;//查询的记录条数
int column;//字段个数
}info;
注册
int Register(int connfd,sqlite3 *db)
{
char buf[128] = {0};
int ret = sqlite3_open("wmk.db",&db);
if(ret != SQLITE_OK)
{
printf("%s\n",sqlite3_errmsg(db));
return -1;
}
strcpy(buf,"create table if not exists user(name char[10],passwd char[20]);");
char *errmsg = NULL;
ret = sqlite3_exec(db,buf,NULL,NULL,&errmsg);
if(ret != SQLITE_OK)
{
printf("%s\n",errmsg);
return -1;
}
b: bzero(buf,sizeof(buf));
sprintf(buf,"select * from user where name='%s';",message.name);
char **result;
int num = 0;
int column = 0;
if(sqlite3_get_table(db,buf,&result,&num,&column,&errmsg) != SQLITE_OK)
{
printf("%s\n",errmsg);
return -1;
}
if(num > 0)
{
message.ifuser = 1;//用户名已存在
}
else
{
message.ifuser = 0;//用户名不存在
bzero(buf,sizeof(buf));
sprintf(buf,"insert into user values('%s','%s');",message.name,message.passwd);
if(sqlite3_exec(db,buf,NULL,NULL,&errmsg) < 0)
{
printf("%s\n",errmsg);
return -1;
}
}
ret = write(connfd,&message,sizeof(message));
if(ret < 0)
{
perror("write");
return -1;
}
if(message.ifuser == 1)
{
ret = read(connfd,&message,sizeof(message));
goto b;
}
printf("注册\n");
return 0;
}
登录
int Login(int connfd,sqlite3 *db)
{
char buf[128] = {0};
int ret = sqlite3_open("wmk.db",&db);
if(ret != SQLITE_OK)
{
printf("%s\n",sqlite3_errmsg(db));
return -1;
}
a: sprintf(buf,"select * from user where name='%s' and passwd='%s';",message.name,message.pass