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

9.16总结

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <myhead.h>#define SER_PORT 8888
#define SER_IP "192.168.71.128"//处理僵尸进程
void handler(int signo)
{if(SIGCHLD == signo){while(waitpid(-1,NULL,WNOHANG)>0);}
}//注册模块
int add_login(sqlite3 *ppDb,char *name,int password)
{char sql[128]="";sprintf(sql,"insert into user values(\"%s\",%d)",name,password);char *errmsg =NULL;if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("注册失败 %s\n",errmsg);sqlite3_free(errmsg);errmsg = NULL;return -1;}if(sqlite3_changes(ppDb)>0){printf("注册成功\n");return 0;}return -1;
}//验证登录信息的模块
int callback(void *arg,int cols,char **msgtext,char **msgheader)
{int *flag_t = (int *)arg;*flag_t = 1;return 0;
}//登录模块
int add_enter(sqlite3 *ppDb,char *name,int password)
{char sql[128]="";sprintf(sql,"select * from user where name = '%s' and password = %d",name,password);int flag = -1;char *errmsg =NULL;if(sqlite3_exec(ppDb,sql,callback,&flag,&errmsg)!=SQLITE_OK){printf("登录失败 %s\n",errmsg);sqlite3_free(errmsg);errmsg=NULL;return -1;}if(flag == 1){printf("登录成功\n");return 0;}else{printf("登录失败,账号或者密码错误请重新尝试\n");return -1;}
}int add_dict(sqlite3 *ppDb)
{FILE *fp=fopen("dict.txt","r");if(fp == NULL){perror("open error");return -1;}char line[1024]="";char *word,*chinese;int count = 0;char *errmsg = NULL;while(fgets(line,sizeof(line),fp)!=NULL){line[strcspn(line,"\n")]='\0'; //这个函数的作用是遍历这个数组直到找到参数2的字符,然后返回已经遍历的个数word = strtok(line," ");chinese = strtok(NULL,"\0");if(word!=NULL&&chinese!=NULL){char sql[1024] = "";sprintf(sql,"insert into dictionaries values('%s','%s')",word,chinese);if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("字典建立失败 :%s\n",errmsg);sqlite3_free(errmsg);errmsg=NULL;}if(sqlite3_changes(ppDb)>0){printf("字典建立成功\n");}}fclose(fp);return 0;}
}
/*--------------主程序-----------*/
int main(int argc, const char *argv[])
{if(signal(SIGCHLD,handler)==SIG_ERR){perror("signal error");return -1;}int sfd = socket(AF_INET,SOCK_STREAM,0);if(sfd == -1){perror("socket error");return -1;}struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_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;}int reuse = 1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("setsockopt error");return -1;}struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);sqlite3 *ppDb = NULL;if(sqlite3_open("./user.db",&ppDb)!=SQLITE_OK){printf("open error");return -1;}//用户表char *sql = "create table if not exists user(name char primary key,password int);";char *errmsg = NULL;if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("用户表创建失败 %s\n",errmsg);sqlite3_free(errmsg);errmsg =NULL;return -1;}//电子词典char *sqk = "create table if not exists dictionaries(word char,chinese char);";char *errmsg_t = NULL;if(sqlite3_exec(ppDb,sqk,NULL,NULL,&errmsg_t)!= SQLITE_OK){printf("电子词典建立失败 %s\n",errmsg_t);sqlite3_free(errmsg_t);errmsg_t = NULL;return -1;}add_dict(ppDb);while(1){int newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen);if(newfd == -1){perror("acceot error");continue;}printf("[%s:%d]链接成功new=%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);pid_t pid = fork();if(pid>0){close(newfd);}if(pid == 0){close(sfd);char buf[512]="";while(1){int len = recv(newfd,buf,sizeof(buf)-1,0);if(len == 0){printf("客户端断开连接\n");break;}buf[len] = '\0';printf("来自客户端的消息:%s\n",buf);char order[20],name[20],password_t[20];char reply[128]="";//这里主要使用strtok函数来分割客户端传来的字符串//分割完成后再依次判断,根据传入order的字符串判断是什么请求char *token = strtok(buf," ");if(token!=NULL){strcpy(order,token);token=strtok(NULL, " ");}else{strcpy(reply,"缺少命令");send(newfd,reply,strlen(reply),0);continue;}if(token!=NULL){strcpy(name,token);token = strtok(NULL," ");}else{strcpy(reply,"缺少账号");send(newfd,reply,strlen(reply),0);continue;}if(token!=NULL){strcpy(password_t,token);token=strtok(NULL," ");}else{strcpy(reply,"缺少密码");send(newfd,reply,strlen(reply),0);continue;}int password = atoi(password_t);if(strcmp(order,"zhuce")==0){if(add_login(ppDb,name,password)==0){strcpy(reply,"注册成功");}else{strcpy(reply,"注册失败");}}else if(strcmp(order,"denglu")==0){if(add_enter(ppDb,name,password)==0){strcpy(reply,"登录成功");}else{strcpy(reply,"登录失败");}}else if(strcmp(order,"quit")==0){strcpy(reply,"退出成功");send(newfd,reply,strlen(reply),0);break;}send(newfd,reply,strlen(reply),0);close(newfd);exit(0);}}}sqlite3_close(ppDb);close(sfd);return 0;
}

上面是服务器代码,下面是客户端代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <myhead.h>#define SER_PORT 8888
#define SER_IP "192.168.71.128"void do_lgin(int sfd)
{printf("============功能选择==========\n");printf("=============1.查阅===========\n");printf("=========2.查看历史记录=======\n");printf("==========3.返回上一级========\n");printf("请选择功能:");int pos =-1;scanf(" %d",&pos);getchar();switch(pos){case 1:printf("请输入需要查阅的单词:");char buf[128]="";fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;char query[258]="";sprintf(query,"query,%s",buf);send(sfd,query,sizeof(query),0);char rbuf[512]="";int len = recv(sfd,rbuf,strlen(rbuf),0);if(len>0){rbuf[len]='\0';printf("查阅结果为: %s\n",rbuf);}break;case 2:break;case 0:exit(0);}
}int main(int argc, const char *argv[])
{int sfd = socket(AF_INET,SOCK_STREAM,0);if(sfd == -1){perror("socket error");return -1;}struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin))== -1){perror("connect error");return -1;}char buf[128]= "";int pos =-1;char name[20]="";char password[20]="";;char receive[512]="";while(1){printf("============登录界面================\n");printf("=============1.注册===================\n");printf("=============2.登录===================\n");printf("=============0.退出===================\n");printf("请选择功能:");scanf(" %d",&pos);getchar();switch(pos){//下面依次为注册,登录,退出模块case 1:printf("请输入注册信息\n");printf("请输入注册账号:");fgets(name,sizeof(name),stdin);name[strlen(name)-1] = 0;printf("请输入注册密码:");fgets(password,sizeof(password),stdin);password[strlen(password)-1] = 0;sprintf(buf,"zhuce %s %s",name,password);send(sfd,buf,strlen(buf),0);int len_1 = recv(sfd,receive,sizeof(receive),0);if(len_1>0){receive[len_1] = '\0';printf("服务器答复:%s\n",receive);}break;case 2:printf("请输入登录信息\n");printf("请输入登录账号:");fgets(name,sizeof(name),stdin);name[strlen(name)-1] = 0;printf("请输入登录密码:");fgets(password,sizeof(password),stdin);password[strlen(password)-1] = 0;sprintf(buf,"denglu %s %s",name,password);send(sfd,buf,strlen(buf),0);int len_2 = recv(sfd,receive,sizeof(receive),0);if(len_2>0){receive[len_2] = '\0';printf("服务器答复:%s\n",receive);}do_lgin(sfd);break;case 0:send(sfd,"quit", 4 ,0);int len_3 = recv(sfd,receive,sizeof(receive),0);if(len_3>0){receive[len_3] = '\0';printf("服务器答复:%s\n",receive);}close(sfd);return 0;default:printf("输入错误,请重新输入\n");}}	close(sfd);return 0;
}

还有字典的查询和历史记录未实现


文章转载自:

http://gARYcCXA.rkkpr.cn
http://KCZjg9de.rkkpr.cn
http://Fdvxotb7.rkkpr.cn
http://EoKKZAoh.rkkpr.cn
http://MC1Ka85b.rkkpr.cn
http://RxJOHCCE.rkkpr.cn
http://RRG2CuKF.rkkpr.cn
http://Nk7192iJ.rkkpr.cn
http://Jk0tEqag.rkkpr.cn
http://s1oGPb5Y.rkkpr.cn
http://6Kx5qwTg.rkkpr.cn
http://MEe1ZpJr.rkkpr.cn
http://s0cSSok5.rkkpr.cn
http://Q9CUdeQR.rkkpr.cn
http://SjNgqXli.rkkpr.cn
http://ZY2yHxKN.rkkpr.cn
http://Z6hnwf42.rkkpr.cn
http://lm0YS41e.rkkpr.cn
http://Z51xw013.rkkpr.cn
http://njkveuEf.rkkpr.cn
http://TsfOHu4u.rkkpr.cn
http://6V2hxZno.rkkpr.cn
http://MbUOuyd2.rkkpr.cn
http://fE0NgPL3.rkkpr.cn
http://myGC3SZI.rkkpr.cn
http://U1OhNGi7.rkkpr.cn
http://rT5Co96N.rkkpr.cn
http://CRaK6kdg.rkkpr.cn
http://JZQGKvcU.rkkpr.cn
http://7K0JSphH.rkkpr.cn
http://www.dtcms.com/a/386015.html

相关文章:

  • Android开机时间查看
  • 探针水平的表达矩阵转换为基因水平的表达矩阵是芯片数据分析中关键的一步
  • PHP基础-语法初步(第七天)
  • 奥威BI与ChatBI:自然语言交互赋能企业数据分析新体验
  • Vue: 组件基础
  • 亚马逊云科技 EC2 服务终端节点:安全高效访问云服务的利器
  • 2026届计算机毕业设计选题 大数据毕业设计选题推荐 题目新颖 数据分析 可视化大屏 通过率高
  • html实现文字横向对齐以及margin的解释
  • 如何轻松找到并畅玩Edge浏览器隐藏的冲浪小游戏
  • K8S中的神秘任务Job与CronJob
  • go grpc开发使用
  • [论文阅读] 人工智能 + 软件工程 | 告别冗余HTML与高算力消耗:EfficientUICoder如何破解UI2Code的token难题
  • Golang语言入门篇004_Go命令详解
  • K8S的Pod状态处理指南
  • Gin框架:构建高性能Go Web应用
  • Golang中的NaN(Not a Number)
  • golang 做webrtc开发核心
  • Go语言中 error 接口与自定义错误类型的深入解析
  • D008 vue+django+neo4j基于知识图谱的政务服务搜索推荐系统
  • 一个高精度通用模板
  • Flink 1.17.2 集群安装部署
  • Git 本地分支推送多个远程分支
  • JVM性能监控与调优(一):命令行工具
  • 协方差——————
  • Node.js 框架 Express 介绍
  • Node.js 文件上传中文文件名乱码问题,为什么只有Node会有乱码问题,其他后端框架少见?
  • Redis 线上遍历 Key 的正确姿势:SCAN 命令详解
  • 【软考】笔记总结二
  • gemini cli 一个可以参考的prompt
  • 第9章 Prompt提示词设计