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

网络编程8.22

词典

服务端
#include <head.h>
#define SER_IP "192.168.109.74"
#define SER_PORT 8888
int result=0;
char p[128]="";
struct text
{char usrname[20];char name[512];char mean[128];char data[128];
};
struct user
{int type;struct us{char usrname[20];char passwrd[20];}use;char words[128];
};
//注册用户信息
int do_insert_usr(sqlite3 *ppdb,struct user usr)
{char sql[128]="";sprintf(sql,"insert into usrinfo values('%s','%s');",usr.use.usrname,usr.use.passwrd);char *errmsg=NULL;if(sqlite3_exec(ppdb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("do_insert_usr error=%s\n",errmsg);sqlite3_free(errmsg);return-1;}printf(" 用户添加成功\n");
}
//回调函数
int call_back(void *arg,int c,char **a,char **b)
{// 接收用户输入的密码用于验证struct user*p = (struct user*)arg;if (strcmp((b+1)[1], p->use.passwrd) == 0){result=1;}else{result=0;}return 0;
}
//用户登录功能
int do_loign_usr(sqlite3 *ppdb,struct user usr)
{char sql[128]="";sprintf(sql,"select *from usrinfo where usrname='%s';",usr.use.usrname);char *errmsg=NULL;if(sqlite3_exec(ppdb,sql,call_back,&usr,&errmsg)!=SQLITE_OK){printf("do_loign_usr error=%s\n",errmsg);sqlite3_free(errmsg);return-1;}
}
//回调函数
int call_back_(void *arg,int c,char **a,char **b)
{strcpy(p,(b+1)[2]);return 0;
}
//查询单词
int do_mean_words(sqlite3 *ppdb,struct user usr)
{char sql[512]="";sprintf(sql,"select *from dirinfo where name='%s';",usr.words);char *errmsg=NULL;if(sqlite3_exec(ppdb,sql,call_back_,&usr,&errmsg)!=SQLITE_OK){printf("do_mean_words error=%s\n",errmsg);sqlite3_free(errmsg);return-1;}}
//插入进历史记录
int do_insert_hisinfo(sqlite3 *ppdb,struct text tex)
{char sql[128]="";sprintf(sql,"insert into hisinfo values('%s','%s','%s','%s');",tex.usrname,tex.name,tex.mean,tex.data);char *errmsg=NULL;if(sqlite3_exec(ppdb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("do_insert_hisinfo error=%s\n",errmsg);sqlite3_free(errmsg);return-1;}}
int call_back_history(void *arg, int col_count, char **col_data, char **col_names) {char *history = (char*)arg;  // 接收局部缓冲区地址int max_len = 2047;          // 预留终止符位置// 如果是第一行且缓冲区为空,先初始化if (strlen(history) == 0) {// 可选择添加列名(可选)// for (int i = 0; i < col_count; i++) {//     strcat(history, col_names[i]);//     strcat(history, "\t");// }// strcat(history, "\n");}if (strlen(history) < max_len - 100) {  // 预留空间for (int i = 0; i < col_count; i++) {strcat(history, col_data[i]);  // 追加字段strcat(history, "\t");         // 字段分隔符}strcat(history, "\n");             // 行分隔符}return 0;
}// 查询历史记录
int do_select_hisinfo(sqlite3 *ppdb, struct user usr, char *history) {char sql[512] = "";sprintf(sql, "select * from hisinfo where usrname='%s';", usr.use.usrname);char *errmsg = NULL;history[0] = '\0';  // 初始化缓冲区(关键!)if (sqlite3_exec(ppdb, sql, call_back_history, history, &errmsg) != SQLITE_OK) {printf("do_select_hisinfo error=%s\n", errmsg);sqlite3_free(errmsg);return -1;}// 如果没有记录,返回提示if (strlen(history) == 0) {strcpy(history, "没有查询历史记录");}return 0;
}int main(int argc, const char *argv[])	
{//创建数据库sqlite3*ppdb=NULL;if(sqlite3_open("./dir.db",&ppdb)!=SQLITE_OK){printf("sqlite3_open error errcode=%d,errmsg=%s\n",sqlite3_errcode(ppdb),sqlite3_errmsg(ppdb));return -1;}int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd==-1){ERR_MSG("socket error");return -1;}int reuse=1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){ERR_MSG("setsockopt 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){ERR_MSG("bind error");return -1;}if(listen(sfd,128)==-1){ERR_MSG("listen error");return -1;}struct sockaddr_in cin;socklen_t addrlen=sizeof(cin);FILE *pfd=fopen("./1.txt","r");if(pfd==NULL){ERR_MSG("open error");return -1;}//创建数据表char *sql="create table if not exists dirinfo(name char,mean char);";char *errmsg=NULL;if(sqlite3_exec(ppdb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("create error=%s\n",errmsg);sqlite3_free(errmsg);return -1;}//将文件内容插入数据表printf("正在调用词典数据表····\n");char buf[128]="";char name[100]="";char mean[128]="";while(fgets(buf,sizeof(buf),pfd)!=NULL){char sql[1000]="";bzero(name,sizeof(name));	bzero(mean,sizeof(mean));	int k=0;int i=0;int j=0;while(buf[k]!=' '&&buf[k]!='\0'){name[i]=buf[k];i++;k++;}name[i]='\0';while(buf[k]==' '){k++;}while(buf[k]!=' '&&buf[k]!='\0'&&buf[k]!='\n'){mean[j]=buf[k];j++;k++;}mean[j]='\0';sprintf(sql,"insert into dirinfo values (\"%s\",\"%s\");",name,mean);char *errmsg=NULL;if(sqlite3_exec(ppdb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("insert error=%s\n",errmsg);sqlite3_free(errmsg);return -1;}	}printf("调用完毕!\n");//创建数据表(用户)char *sql1="create table if not exists usrinfo(usrname char UNIQUE NOT NULL,passwrd char NOT NULL);";char *errmsg1=NULL;if(sqlite3_exec(ppdb,sql1,NULL,NULL,&errmsg1)!=SQLITE_OK){printf("create error=%s\n",errmsg1);sqlite3_free(errmsg1);return -1;}//创建数据表(历史记录)char *sql2="create table if not exists hisinfo(usrname char,name char,mean char,data char);";char *errmsg2=NULL;if(sqlite3_exec(ppdb,sql2,NULL,NULL,&errmsg2)!=SQLITE_OK){printf("create error=%s\n",errmsg2);sqlite3_free(errmsg2);return -1;}while(1){int newfd = accept(sfd, (struct sockaddr*)&cin, &addrlen);if(newfd == -1){ERR_MSG("accept error");continue; // 继续等待下一个连接,而不是return}pid_t pid = fork();if(pid > 0){// 父进程:关闭newfd,继续等待新连接close(newfd);}else if(pid == 0){// 子进程:处理客户端通信close(sfd); // 关闭监听socketwhile(1) // 添加循环持续接收消息{struct user usr = {};ssize_t ret = recv(newfd, &usr, sizeof(usr), 0);if(ret <= 0){if(ret == 0) {printf("客户端断开连接\n");} else {ERR_MSG("recv error");return -1;}break; // 退出循环}switch(usr.type){case 1: // 注册do_insert_usr(ppdb, usr);{char s[128] = "注册成功!";send(newfd, s, strlen(s), 0);}break;case 2: // 登录{do_loign_usr(ppdb, usr);char s[128]="";if(result == 1) {strcpy(s, "登录成功!");} else {strcpy(s, "登录失败!");}printf("%s用户已经登录\n",usr.use.usrname);send(newfd, s, sizeof(s), 0);}break;case 3:{do_mean_words(ppdb,usr);printf("查询成功\n");struct text tex;time_t b=time(NULL);struct tm*p1=localtime(&b);send(newfd,p,sizeof(p),0);	snprintf(tex.data,sizeof(tex.data)-1,"%d-%d-%d %02d:%02d:%02d\n",p1->tm_year+1900,p1->tm_mon+1,p1->tm_mday,\p1->tm_hour,p1->tm_min,p1->tm_sec);strcpy(tex.usrname,usr.use.usrname);strcpy(tex.name,usr.words);strcpy(tex.mean,p);do_insert_hisinfo(ppdb,tex);break;}case 4:{char history[2048];  // 局部缓冲区,每次查询都是新的do_select_hisinfo(ppdb, usr, history);  // 传入局部缓冲区send(newfd, history, strlen(history) + 1, 0);  // 发送完整记录break;}default:{char s[128] = "未知操作类型";send(newfd, s, strlen(s), 0);}break;}}close(newfd);exit(0); // 子进程退出}else{ERR_MSG("fork error");close(newfd);}}}
客户端
#include <head.h>
#define SER_IP "192.168.109.74"
#define SER_PORT 8888
struct text
{char usrname[20];char name[512];char mean[128];char data[128];
};
struct user
{int type;// 1为注册,2为登录, 3为查询, 4为查询历史记录struct us{char usrname[20];char passwrd[20];}use;		char words[128];};
int main(int argc, const char *argv[])
{int cfd=socket(AF_INET,SOCK_STREAM,0);if(-1==cfd){ERR_MSG("socket error");return -1;}printf("创建成功\n");struct sockaddr_in sin;sin.sin_port=htons(SER_PORT);sin.sin_family=AF_INET;sin.sin_addr.s_addr=inet_addr(SER_IP);if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){ERR_MSG("connect error");}printf("连接成功\n");int menu=-1;while(1){printf("======英语词典=====\n");	printf("======1.注册=====\n");printf("======2.登录=====\n");printf("======3.退出=====\n");printf("请问你要执行的操作为:");scanf("%d",&menu);getchar();switch (menu){case 1:{struct user usr={1};printf("请问你要注册的用户名为:");scanf("%s",usr.use.usrname);getchar();printf("请问你要注册的密码为:");scanf("%s",usr.use.passwrd);getchar();send(cfd,&usr,sizeof(usr),0);char s[128]="";recv(cfd,s,sizeof(s),0);printf("%s\n",s);break;}case 2:{struct user usr;usr.type=2;printf("请输入你的用户名:");scanf("%s",usr.use.usrname);getchar();printf("请输入你的密码:");scanf("%s",usr.use.passwrd);getchar();send(cfd,&usr,sizeof(usr),0);char s[128]="";recv(cfd,s,sizeof(s),0);printf("%s\n",s);if(strcmp(s, "登录成功!")==0){while(1){int a;printf("======英语词典=====\n");	printf("======1.查询单词=====\n");printf("======2.历史记录=====\n");printf("======3.返回=========\n");printf("请输入你要执行的操作:");scanf("%d",&a);switch(a){case 1:{struct user usr1;usr1.type=3;printf("请输入你要查询的单词:");scanf("%s",usr1.words);send(cfd,&usr1,sizeof(usr1),0);char p1[128]="";recv(cfd,p1,sizeof(p1),0);printf("%s\n",p1);break;}case 2:{struct user usr2;usr2.type=4;send(cfd,&usr2,sizeof(usr2),0);char str1[2048]="";recv(cfd,str1,sizeof(str1),0);printf("%s\n",str1);break;}case 3:{break;};}}}break;}case 3:return 0;default:printf("输入错误,请重新输入!\n");break;}}close(cfd);return 0;
}

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

相关文章:

  • Python面试常考函数
  • 技术分析 剖析一个利用FTP快捷方式与批处理混淆的钓鱼攻击
  • RSS与今日头条技术对比分析
  • Unreal Engine UObject
  • 嵌入式-EXTI的工作原理和按钮实验-Day19
  • 6口千兆图像采集卡:突破多路高清视觉系统的传输瓶颈
  • DFS序与树链剖分入门
  • RORPCAP: retrieval-based objects and relations prompt for image captioning
  • 多元函数积分学
  • kafka生产者 消费者工作原理
  • 线性回归8.21
  • 椭圆、双曲线、抛物线总对比表
  • Java 对象内存布局详解
  • Docker容器化部署实战:Tomcat与Nginx服务配置指南
  • 大模型推理-MTK Neurapilot sdk了解与环境配置-1
  • Unreal Engine UPrimitiveComponent
  • QT5 UI界面上Scroll Area控件显示滚动条
  • 浏览器开发CEFSharp+X86+win7(十三)之Vue架构自动化——仙盟创梦IDE
  • Lua脚本如何执行主程序的C函数
  • 智能二维码QR\刷IC卡\人脸AI识别梯控系统功能设计需基于模块化架构,整合物联网、生物识别、权限控制等技术,以下是多奥分层次的系统设计框架
  • 攻防世界—bug
  • 深度学习①【张量、全连接神经网络、激活函数、交叉熵损失函数】
  • 机器学习之线性回归:原理、实现与实践
  • 定制化鲜狗粮:宠物经济浪潮下的“精准喂养”革命
  • Python 办公自动化实战:Excel 批量处理 + 自动发邮件
  • 博士招生 | 英国谢菲尔德大学 招收计算机博士
  • 数据结构 -- 栈
  • 鹰角网络基于阿里云 EMR Serverless StarRocks 的实时分析工程实践
  • CDN行业中的SA板卡限速是什么
  • 品牌出海狂潮里,独立站支付的「隐形基建」正在改写规则