当前位置: 首页 > news >正文

8.21作业

基于TCP的网络电子词典

服务器代码

#include <25061head.h>#define SYSTEM_PORT 8888
#define SYSTEM_IP "192.168.109.126"//创建字典的数据库
int create_dict_table(sqlite3 *ppDb)
{char *sql="create table if not exists Dict(word char,meaning char);";char *errmsg=NULL;if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("字典库创建失败:%s\n",errmsg);sqlite3_free(errmsg);return -1;}printf("字典库创建成功\n");}//创建用户的数据库 
int create_user_table(sqlite3 *ppDb)
{char *sql="create table if not exists User(id char,key char,flag int);";char *errmsg=NULL;if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("用户库创建失败:%s\n",errmsg);sqlite3_free(errmsg);return -1;}printf("用户库创建成功\n");
}//创建历史记录数据库
int create_history_table(sqlite3 *ppDb)
{char *sql="create table if not exists History(id char,word char,mean char,time text);";char *errmsg=NULL;if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("历史库创建失败:%s\n",errmsg);sqlite3_free(errmsg);return -1;}printf("历史库创建成功\n");
}int word_into_dict(sqlite3 *ppDb)
{FILE *file=fopen("./dict.txt","r");if(!file){printf("无法打开\n");return -1;}char line[10240];int count=0;char *errmsg=NULL;if(sqlite3_exec(ppDb,"begin transaction;",NULL,NULL,&errmsg)!=SQLITE_OK){printf("导入失败:%s\n",errmsg);sqlite3_free(errmsg);fclose(file);return -1;}while(fgets(line,sizeof(line),file)){line[strcspn(line,"\n")]=0;char *space=strchr(line,' ');if(!space){continue;}*space='\0';char *word=line;char *meaning=space+1;while(*meaning==' '){meaning++;}char sql[512];snprintf(sql,sizeof(sql),"insert into Dict values('%s','%s');",word,meaning);if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("插入失败;%s\n",errmsg);sqlite3_free(errmsg);}else{count++;}}if(sqlite3_exec(ppDb,"commit",NULL,NULL,&errmsg)!=SQLITE_OK){printf("提交失败:%s\n",errmsg);sqlite3_free(errmsg);}fclose(file);printf("导入成功%d个单词到数据库\n",count);return count;
}//用户注册
void user_register(int client_fd,sqlite3 *ppDb_user,const char *id,const char *key)
{char sql[256];char *errmsg=NULL;sprintf(sql,"insert into User values('%s','%s',0);",id,key);if(sqlite3_exec(ppDb_user,sql,NULL,NULL,&errmsg)!=SQLITE_OK){send(client_fd,"register error",14,0);sqlite3_free(errmsg);}else{send(client_fd,"register success",16,0);}
}//用户登录
void login(int client_fd,sqlite3 *user_db,const char *id,const char *key)
{char sql[256];char *errmsg=NULL;sprintf(sql,"select *from User where id='%s' and key='%s';",id,key);int row,col;char **result;if(sqlite3_get_table(user_db,sql,&result,&row,&col,&errmsg)!=SQLITE_OK){send(client_fd,"login error",11,0);sqlite3_free(errmsg);return;}if(row==0){send(client_fd,"no found",8,0);}else{//检查登录状态sprintf(sql,"select flag from User where id='%s';",id);int login_flag=0;char **flag_result;if(sqlite3_get_table(user_db,sql,&flag_result,&row,&col,&errmsg)!=SQLITE_OK&&row>0){login_flag=atoi(flag_result[1]);sqlite3_free(errmsg);}if(login_flag==1){send(client_fd,"on line",7,0);}else{sprintf(sql,"update User set flag=1 where id='%s';",id);sqlite3_exec(user_db,sql,NULL,NULL,NULL);send(client_fd,"login success",13,0);}}sqlite3_free_table(result);}//单词查询
void query(int client_fd,sqlite3 *dict_db,sqlite3 *user_db,const char *id,const char *word)
{char sql[256];char *errmsg=NULL;int row,col;char **result;sprintf(sql,"select * from Dict where word='%s';",word);if(sqlite3_get_table(dict_db,sql,&result,&row,&col,&errmsg)!=SQLITE_OK){send(client_fd,"query error",11,0);sqlite3_free(errmsg);return;}if(row==0){send(client_fd,"no found",9,0);}else{send(client_fd,result[col+1],strlen(result[col+1]),0);//记录查询历史time_t now=time(NULL);char time_str[20];strftime(time_str,sizeof(time_str),"%Y-%m-%d %H:%M:%S",localtime(&now));sprintf(sql,"insert into History values('%s','%s','%s','%s');",id,word,result[col+1],time_str);sqlite3_exec(user_db,sql,NULL,NULL,NULL);}sqlite3_free_table(result);
}//查询记录
void check_history(int client_fd,sqlite3 *user_db,const char *id)
{char sql[256];char *errmsg=NULL;int row,col;char **result;sprintf(sql,"select word,time from History where id='%s';",id);if(sqlite3_get_table(user_db,sql,&result,&row,&col,&errmsg)){send(client_fd,"history query error",19,0);sqlite3_free(errmsg);return;}if(row==0){send(client_fd,"no history records",18,0);}else{char response[1024]={0};for(int i=1;i<=row;i++){strcat(response,result[i*col]);strcat(response,"-");strcat(response,result[i*col+1]);strcat(response,"\n");}send(client_fd,response,strlen(response),0);}sqlite3_free_table(result);
}//处理客户端请求
void handle_client(int client_fd)
{sqlite3 *dict_db;sqlite3 *user_db;if(sqlite3_open("./dict.db",&dict_db)!=SQLITE_OK){printf("无法打开字典数据库\n");close(client_fd);return;}if(sqlite3_open("./user.db",&user_db)!=SQLITE_OK){printf("无法打开用户数据库\n");sqlite3_close(dict_db);close(client_fd);return;}create_dict_table(dict_db);create_user_table(user_db);create_history_table(user_db);char buf[512];char id[50]={0};int login_flag=0;while(1){memset(buf,0,sizeof(buf));int ret=recv(client_fd,buf,sizeof(buf),0);if(ret<=0){printf("客户端已断开\n");sqlite3 *db;char sql[256];char *errmsg=NULL;sprintf(sql,"drop table Dict;");if(sqlite3_exec(db,sql,NULL,NULL,NULL)!=SQLITE_OK){printf("删除失败:%s\n",errmsg);sqlite3_free(errmsg);return;}//更新用户离线状态if(login_flag){char sql[256];sprintf(sql,"update User set flag=0 where id='%s';",id);sqlite3_exec(user_db,sql,NULL,NULL,NULL);}break;}//解析命令char cmd[10],msg1[50],msg2[50];sscanf(buf,"%s %s %s",cmd,msg1,msg2);if(strcmp(cmd,"register")==0){user_register(client_fd,user_db,msg1,msg2);}else if(strcmp(cmd,"login")==0){strcpy(id,msg1);login(client_fd,user_db,msg1,msg2);login_flag=1;}else if(strcmp(cmd,"query")==0){if(!login_flag){send(client_fd,"please login first",18,0);}else{query(client_fd,dict_db,user_db,id,msg1);}}else if(strcmp(cmd,"history")==0){if(!login_flag){send(client_fd,"please login first",18,0);}else{check_history(client_fd,user_db,id);}}else if(strcmp(cmd,"quit")==0){break;}else{send(client_fd,"unknow command",15,0);}}sqlite3_close(dict_db);sqlite3_close(user_db);close(client_fd);
}int main(int argc, const char *argv[])
{sqlite3 *dict_db;if(sqlite3_open("./dict.db",&dict_db)==SQLITE_OK){create_dict_table(dict_db);word_into_dict(dict_db);sqlite3_close(dict_db);}int sfd=socket(AF_INET,SOCK_STREAM,0);if(-1==sfd){perror("socket error");return -1;}int reuse=1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("setsockopt error");return -1;}struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SYSTEM_PORT);sin.sin_addr.s_addr=inet_addr(SYSTEM_IP);if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error");return -1;}if(listen(sfd,128)==-1){perror("listen error");return -1;}printf("server started on:%s:%s\n",argv[1],argv[2]);while(1){struct sockaddr_in cin;socklen_t addrlen=sizeof(cin);int client_fd=accept(sfd,(struct sockaddr*)&cin,&addrlen);if(-1==client_fd){perror("accept error");continue;}printf("用户%s:%d已连接\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));pid_t pid=fork();if(pid==0){close(sfd);handle_client(client_fd);exit(0);}else if(pid>0){close(client_fd);}else{perror("pork error");close(client_fd);}}close(sfd);return 0;
}

客户端代码

#include <25061head.h>#define SYSTEM_PORT 8888
#define SYSTEM_IP "192.168.109.126"int main(int argc, const char *argv[])
{int sfd=socket(AF_INET,SOCK_STREAM,0);if(-1==sfd){perror("socket error");return -1;}int reuse=1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("setsockopt error");return -1;}struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SYSTEM_PORT);sin.sin_addr.s_addr=inet_addr(SYSTEM_IP);if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect error");close(sfd);return -1;}printf("connect success\n");char buf[1024];int choice;char id[32],key[32],word[50];int logged_in=0;while(1){if(!logged_in){system("clear");printf("\n *************** 主菜单 *************** \n");printf("\n *************** 1.注册 *************** \n");printf("\n *************** 2.登录 *************** \n");printf("\n *************** 3.退出 *************** \n");printf("请输入:");scanf("%d",&choice);getchar();if(choice==3){printf("再见\n");exit(0);}printf("请输入用户名:");fgets(id,sizeof(id),stdin);printf("请输入密码:");fgets(key,sizeof(key),stdin);if(choice==1){sprintf(buf,"register %s %s",id,key);send(sfd,buf,strlen(buf),0);memset(buf,0,sizeof(buf));recv(sfd,buf,sizeof(buf),0);printf("服务器响应:%s\n",buf);}else if(choice==2){sprintf(buf,"login %s %s",id,key);send(sfd,buf,strlen(buf),0);memset(buf,0,sizeof(buf));recv(sfd,buf,sizeof(buf),0);printf("服务器响应:%s\n",buf);if(strstr(buf,"login success")!=NULL){logged_in=1;printf("welcome\n");}}}else{printf("\n *************** 主菜单 *************** \n");printf("\n *************** 1.查询 *************** \n");printf("\n *************** 2.历史 *************** \n");printf("\n *************** 3.退出 *************** \n");scanf("%d",&choice);getchar();if(choice==3){sprintf(buf,"quit");send(sfd,buf,strlen(buf),0);logged_in=0;printf("退出成功\n");continue;}if(choice==1){printf("请输入单词:");fgets(word,sizeof(word),stdin);sprintf(buf,"query %s",word);send(sfd,buf,strlen(buf),0);memset(buf,0,sizeof(buf));recv(sfd,buf,sizeof(buf),0);printf("%s\n",buf);}else if(choice==2){sprintf(buf,"history");send(sfd,buf,strlen(buf),0);memset(buf,0,sizeof(buf));recv(sfd,buf,sizeof(buf),0);printf("\n%s\n",buf);}}}close(sfd);return 0;
}

结果图

http://www.dtcms.com/a/343539.html

相关文章:

  • 【运维进阶】if 条件语句的知识与实践
  • AI设计师-标小智旗下AI在线设计平台
  • 洛谷 P4942 小凯的数字-普及-
  • Hybrid laser 是什么?
  • BFS算法C++实现(邻接表存储)
  • 最爱--中岛美雪
  • 8 月 20 日科技新动态:多领域创新成果涌现
  • 【typenum】 19 类型相同检查(type_operators.rs片段)
  • Esp32基础(⑩超声波测距模块)
  • Pycharm SSH连接
  • Wireshark数据包波形绘制异常
  • [RestGPT] docs | RestBench评估 | 配置与环境
  • 【51单片机】【protues仿真】基于51单片机16键电子琴系统
  • 【GPT入门】第51课 Conda环境迁移教程:将xxzh环境从默认路径迁移到指定目录
  • OpenAI 开源模型 gpt-oss 是在合成数据上训练的吗?一些合理推测
  • Mysql事务特性
  • python实现根据接口返回数据生成报告和图表
  • (第二十期下)超链接的更多分类
  • 医疗元宇宙:破解医疗困局与数字化变革路径
  • gRPC 服务发现选型对比
  • 基于STM32单片机的二维码识别物联网OneNet云仓库系统
  • 最小生成树的普利姆算法和克鲁斯卡尔算法
  • ABP vNext 速率限制在多租户场景落地
  • Leetcode 深度优先搜索 (13)
  • Leetcode 深度优先搜索 (12)
  • 20250821 圆方树总结
  • 通信基础理论
  • C语言基础习题——01
  • plantsimulation小知识25.08.21 对话框的使用方法
  • 深圳大学-计算机信息管理课程实验 C++ 自考模拟题