电子词典项目

目录

目录

头文件:dict.h:

源文件:dict.c:

服务器测试文件:serDict.c:

客户端测试文件:cliDict.c:


头文件:dict.h:
#ifndef __DICT_H__
#define __DICT_H__
#include<myhead.h>
#include<sqlite3.h>#define SERIP "192.168.114.73"
#define PORT 8888#define ERR_MSG(msg) do{\printf("%d: ",__LINE__);\perror(msg);\
}while(0);/*服务器使用  */
//词典数据库的初始化和导入
int dict_init(sqlite3 *db);//TCP服务器搭建函数
int TCP_ser_set(struct sockaddr_in* psin);//回收子进程函数
void handler(int signum);//子进程中的操作
void child_operate(int newfd, sqlite3 *db);
/*服务器使用  *//*客户端使用  */
//TCP客户端搭建函数
int TCP_cli_set();//客户端中的操作
void cli_operate(int cfd);/*客户端使用  */
#endif
源文件:dict.c:
#include<myhead.h>
#include<sqlite3.h>
#include "dict.h"int do_create(sqlite3 *db);
int do_insert(sqlite3 *db, char * English, char *Chinese);
int msg_get(FILE *fp, char*pEng, char *pChin);
int do_init(sqlite3 *db);
int usrname_not_reuse(sqlite3 *db, const char *usrname, const char *tablename);int dict_init(sqlite3 *db)
{//初始化数据库中词典数据表do_init(db);printf("数据库初始化成功\n");//打开文件FILE *fp;char English[32] = "";char Chinese[64] = "";if(NULL == (fp=fopen("./dict.txt","r"))){printf("%d:",__LINE__);perror("fopen error");return -1;}//创建表格do_create(db);printf("词典数据导入中\n...\n");while(1){//从dict.txt中读取一行的数据bzero(English, sizeof(English));bzero(Chinese, sizeof(Chinese));msg_get(fp, English, Chinese);//将English和Chinese写入表格中do_insert(db, English, Chinese);//printf("%s\t%s\n",English, Chinese);if(feof(fp)){printf("导入成功\n");break;}}//关闭文件fclose(fp);return 0;
}int msg_get(FILE *fp, char* pEng, char *pChin){char tmp = 0;int i = 0;while((tmp = fgetc(fp))!=' '){pEng[i] = tmp;i++;if(feof(fp)){return 0;}}i = 0;while(fgetc(fp)==' ');fseek(fp,-1,SEEK_CUR);while((tmp = fgetc(fp))!='\n'){pChin[i] = tmp;i++;if(feof(fp)){pChin[i-1] = 0;break;}}return 0;
}int do_create(sqlite3 *db){if(db == NULL){printf("数据库不存在\n");return -1;}//创建词典数据表char sql[128] = "create table if not exists dict(ENGLISH char, TRANSLATION char);";char *errmsg = NULL;if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK){printf("%d:sqlite3_exec error %s\n",__LINE__, sqlite3_errmsg(db));return -1;		}//创建已注册用户数据表bzero(sql,sizeof(sql));strcpy(sql,"create table if not exists registeredUsr(id char primary key, passwd char);");if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK){printf("%d:sqlite3_exec error %s\n",__LINE__, sqlite3_errmsg(db));return -1;		}//创建已登录用户数据表bzero(sql,sizeof(sql));strcpy(sql,"create table if not exists loadedUsr(id char primary key, passwd char);");if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK){printf("%d:sqlite3_exec error %s\n",__LINE__, sqlite3_errmsg(db));return -1;		}//创建成功return 0;
}int do_init(sqlite3 *db){if(db == NULL){printf("数据库不存在\n");return -1;}char sql[128] = "drop table dict;";char *errmsg = NULL;if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK){printf("%d:sqlite3_exec error %s\n",__LINE__, sqlite3_errmsg(db));return -1;		}//创建成功return 0;
}//插入表格函数
int do_insert(sqlite3 *db, char * English, char *Chinese){if(db == NULL){printf("数据库不存在\n");return -1;}char sql[128] = "";snprintf(sql, sizeof(sql),"insert into dict values(\"%s\", \"%s\");",English, Chinese);char *errmsg = NULL;if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK){printf("%d:sqlite3_exec error %s\n",__LINE__, sqlite3_errmsg(db));return -1;		}return 0;
}//TCP服务器搭建函数
int TCP_ser_set(struct sockaddr_in* psin){int sfd;if((sfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ERR_MSG("socket error");return -1;}int optval = 1;//允许端口快速复用if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval))<0){ERR_MSG("setsockopt error");return -1;}//获取地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr = inet_addr(SERIP);* psin = sin;//绑定if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin))<0){ERR_MSG("bind error");return -1;}//设为监听if(listen(sfd,128)<0){ERR_MSG("listen error");return -1;}printf("服务器搭建成功\n");return sfd;
}//回收子进程函数
void handler(int signum){while(waitpid(-1,NULL,WNOHANG)!=0);
}//子进程中的操作
void child_operate(int newfd, sqlite3 *db){//判断传入的newfd是否合法if(newfd<0){printf("连接失败\n");return;}char buf[150] = " ";//用于读取数据包中的操作码unsigned short *operatorPtr = (unsigned short*)buf;//用于登录后记录用户名,便于读写对应用户的历史记录数据库char usrname[20] = " ";//用于读取数据包中的用户名char *usrnamePtr = buf + 2;//需要后续计算得到数据包中数据的位置char *dataPtr = NULL;//获取用户名的长度int usrnameLen = 0;//定义一个变量接收返回值int res = 0;//保存命令的数组char sql[128] = " ";while(1){bzero(buf,sizeof(buf));//接收if(recv(newfd, buf, sizeof(buf), 0) == -1){ERR_MSG("recv error");break;}//获取的是用户名的长度usrnameLen = strlen(usrnamePtr);//可知数据包中数据的位置为dataPtr = usrnamePtr + usrnameLen + 1;//printf("%s\n",buf);//send(newfd,buf,sizeof(buf),0);//注册if(1 == *operatorPtr){//现在,usrnamePtr指向用户名,dataPtr是数据的起头,在注册里面,数据包应该保存用户对应的密码//检索已注册用户数据表,看看用户名是否存在res = usrname_not_reuse(db, usrnamePtr, "registeredUsr");if(-1 == res){//说明这个函数调用遇到问题//组一个返回包*operatorPtr = 7;strcpy(dataPtr,"there is something wrong");}else if(0 == res){//说明用户名已存在*operatorPtr = 7;strcpy(dataPtr,"用户名已存在");}else if(1 == res){//说明用户名不在数据库中,可以进行注册bzero(sql, sizeof(sql));snprintf(sql, sizeof(sql),"insert into registeredUsr values(\"%s\", \"%s\");",usrnamePtr, dataPtr);char *errmsg = NULL;if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK){printf("%d:sqlite3_exec error %s\n",__LINE__, sqlite3_errmsg(db));break;	}*operatorPtr = 7;strcpy(dataPtr,"注册成功");}}else if(2 == *operatorPtr){//登录//现在,usrnamePtr指向用户名,dataPtr是数据的起头,在登录里面,数据包应该保存用户对应的密码//检索已登录用户数据表,看看用户名是否存在res = usrname_not_reuse(db, usrnamePtr, "registeredUsr");if(-1 == res){//说明这个函数调用遇到问题//组一个返回包*operatorPtr = 7;strcpy(dataPtr,"there is something wrong");}else if(1 == res){//说明在已注册表中未找到该用户,说明该账号还没被注册*operatorPtr = 7;strcpy(dataPtr,"该账号还未被注册,请先注册");}else if(0 == res){//说明在已注册表中找到了该用户,进行下一步登录操作res = usrname_not_reuse(db, usrnamePtr, "loadedUsr");if(-1 == res){//说明这个函数调用遇到问题//组一个返回包*operatorPtr = 7;strcpy(dataPtr,"there is something wrong");}else if(0 == res){//说明用户名已存在已登录数据表,说明用户已经登录*operatorPtr = 7;strcpy(dataPtr,"该账号已登录,请检查账号是否被盗用");}else if(1 == res){//说明该用户已注册且未登录,可以进行登录bzero(sql, sizeof(sql));char **result = NULL;int row = 0;int col = 0;char *errmsg = NULL;int flag = 0;snprintf(sql,sizeof(sql),"select id,passwd from registeredUsr;");if((res = sqlite3_get_table(db, sql, &result, &row, &col, &errmsg))!=0){printf("%d:sqlite3_get_table error\n",__LINE__);printf("%s\n",strerror(res));break;}//遍历比较,第0行是项的名,所以从第一行开始for(int i=col; i<=row*col; i+=col){if(strcmp(*(result+i),usrnamePtr) == 0&&strcmp(*(result+i+1),dataPtr) == 0){//登录成功后要将用户数据写入已登录用户数据表bzero(sql, sizeof(sql));snprintf(sql, sizeof(sql),"insert into loadedUsr values(\"%s\", \"%s\");",usrnamePtr, dataPtr);char *errmsg = NULL;if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK){printf("%d:sqlite3_exec error %s\n",__LINE__, sqlite3_errmsg(db));break;	}//满足条件说明用户密码匹配成功,即登录成功*operatorPtr = 7;strcpy(dataPtr,"登录成功");//将登录成功的用户名保存strcpy(usrname,usrnamePtr);flag = 0;//然后应该新建一个对应用户的历史记录数据表bzero(sql, sizeof(sql));snprintf(sql, sizeof(sql),"create table if not exists %shis(ENGLISH char , TRANSLATION char, current timestamp default current_timestamp);",usrname);if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK){printf("%d:sqlite3_exec error %s\n",__LINE__, sqlite3_errmsg(db));break;		}break;}else{flag = 1;}}if(1 == flag){*operatorPtr = 7;strcpy(dataPtr,"密码错误");}}}}else if(3 == *operatorPtr){//退出//先判断该进程中usrname字符串内是否有内容,如果有的话,说明用户是异常退出,先帮用户//退出登录,再进行退出操作if(usrname[0]!=0){//usrname字符串的第一个元素不为0,说明非空,检查usrname字符串内容是否在//已登录用户信息数据表中res = usrname_not_reuse(db, usrname, "loadedUsr");if(0 == res){//说明用户还在已登录用户信息表中,说明用户确实是异常退出,先退出登录//从已登录用户数据表中,将用户名对应的项删除bzero(sql, sizeof(sql));char *errmsg = NULL;snprintf(sql,sizeof(sql),"delete from loadedUsr where id=\'%s\';",usrname);if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK){printf("%d:sqlite3_exec error %s\n",__LINE__, sqlite3_errmsg(db));break;	}//将usrname这个字符串清空bzero(usrname,sizeof(usrname));}else if(1 == res){//说明用户已经退出登录bzero(usrname,sizeof(usrname));}		}//结束函数return;}else if(4 == *operatorPtr){//查询//接收到要查询的英文单词,需要在dict数据表中查找,没找到的话也应该返回一个数据提示bzero(sql, sizeof(sql));char **result = NULL;int row = 0;int col = 0;char *errmsg = NULL;int flag = 0;snprintf(sql,sizeof(sql),"select ENGLISH,TRANSLATION from dict where ENGLISH=\'%s\';",dataPtr);if((res = sqlite3_get_table(db, sql, &result, &row, &col, &errmsg))!=0){printf("%d:sqlite3_get_table error\n",__LINE__);printf("%s\n",strerror(res));break;}*operatorPtr = 7;if(strcmp(*(result+2),dataPtr)==0){//如果查找到的因为原型与发送来的相同,说明要找的单词存在snprintf(dataPtr,128,"%s\t%s",*(result+2),*(result+3));//将对应的英文及其翻译还有当时时间记录bzero(sql, sizeof(sql));snprintf(sql, sizeof(sql),"insert into %shis values(\"%s\", \"%s\",CURRENT_TIMESTAMP);",usrname, *(result+2), *(result+3));if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK){printf("%d:sqlite3_exec error %s\n",__LINE__, sqlite3_errmsg(db));break;	}}else{//否则不存在,发送一个反馈的包strcpy(dataPtr,"抱歉该单词还未收录");}}else if(5 == *operatorPtr){//历史记录bzero(sql, sizeof(sql));char **result = NULL;int row = 0;int col = 0;char *errmsg = NULL;int flag = 0;bzero(sql, sizeof(sql));snprintf(sql,sizeof(sql),"select * from %shis;",usrname);//printf("%s\n",sql);if((res = sqlite3_get_table(db, sql, &result, &row, &col, &errmsg))!=0){printf("%d:sqlite3_get_table error\n",__LINE__);printf("%s\n",strerror(res));break;}*operatorPtr = 7;for(int i=col; i<=row*col; i+=col){*operatorPtr = 7;snprintf(dataPtr,128,"%s\t%s\t%s",*(result+i),*(result+i+1),*(result+i+2));//发送返回的数据包send(newfd, buf, sizeof(buf), 0);bzero(dataPtr,128);}}else if(6 == *operatorPtr){//退出登录//从已登录用户数据表中,将用户名对应的项删除bzero(sql, sizeof(sql));char *errmsg = NULL;snprintf(sql,sizeof(sql),"delete from loadedUsr where id=\'%s\';",usrname);if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK){printf("%d:sqlite3_exec error %s\n",__LINE__, sqlite3_errmsg(db));break;	}//将usrname这个字符串清空bzero(usrname,sizeof(usrname));*operatorPtr = 7;strcpy(dataPtr,"账号成功退出登录");}else{}//发送返回的数据包send(newfd, buf, sizeof(buf), 0);}}//查询用户名是否重复函数
int usrname_not_reuse(sqlite3 *db, const char *usrname, const char *tablename){char **res = NULL;int row = 0;int col = 0;char *errmsg = NULL;//调用查询函数char sql[128] = " ";snprintf(sql,sizeof(sql),"select id from %s;",tablename);if(sqlite3_get_table(db, sql, &res, &row, &col, &errmsg)!=0){printf("%d:sqlite3_get_table error\n",__LINE__);return -1;}//遍历比较,第0行是项的名,所以从1开始for(int i=1; i<=row; i++){if(strcmp(*(res+i),usrname) == 0){//满足条件说明用户名已存在,返回0return 0;}}//遍历到结束,说明该用户名还未存在,返回1return 1;
}//TCP客户端搭建函数
int TCP_cli_set(){int cfd;if((cfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ERR_MSG("socket error");return -1;}int optval = 1;//允许端口快速复用if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval))<0){ERR_MSG("setsockopt error");return -1;}//获取地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr = inet_addr(SERIP);//连接if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin))<0){ERR_MSG("connect error");return -1;}printf("客户端搭建成功\n");return cfd;
}//客户端中的操作
void cli_operate(int cfd){if(cfd<0){printf("文件描述符有误\n");return;}//菜单int opt = 0;char buf[150] = " ";unsigned short *operatorPtr = (unsigned short *)buf;//记录用户名char id[20] = " ";//记录用户名长度int idlen = 0;//记录已登录用户的用户名char loadedid[20] = " ";int loadedidlen = 0;//记录密码char passwd[20] = " ";//记录密码长度int passwdlen = 0;while(1){bzero(buf,sizeof(buf));bzero(id,sizeof(id));bzero(passwd,sizeof(passwd));system("clear");printf("****************************\n");printf("**********电子词典**********\n");printf("***********1.注册***********\n");printf("***********2.登录***********\n");printf("***********3.退出***********\n");printf("****************************\n");printf("请输入>>");scanf("%d",&opt);if(1 == opt){//注册*operatorPtr = 1;printf("请输入要注册的用户名:");while(1){scanf("%s",id);while(getchar()!=10);//记录账号长度,保证长度符合要求才能跳出循环idlen = strlen(id);if(idlen>0&&idlen<20){break;}printf("账号长度请不要超过20,请重新输入:");}printf("请输入密码:");while(1){scanf("%s",passwd);while(getchar()!=10);//记录密码长度,保证长度符合要求才能跳出循环passwdlen = strlen(passwd);if(passwdlen<20&&passwdlen>0){break;}printf("密码长度请不要超过20,请重新输入:");}//将账号写到对应位置strcpy(buf+2,id);//将密码写到对应位置strcpy(buf+3+idlen,passwd);send(cfd, buf, sizeof(buf), 0);recv(cfd, buf, sizeof(buf), 0);printf("%s\n",buf+3+idlen);}else if(2 == opt){//登录*operatorPtr = 2;printf("请输入要登录的用户名:");while(1){scanf("%s",id);while(getchar()!=10);//记录账号长度,保证长度符合要求才能跳出循环idlen = strlen(id);if(idlen>0&&idlen<20){break;}printf("账号长度请不要超过20,请重新输入:");}printf("请输入密码:");while(1){scanf("%s",passwd);while(getchar()!=10);//记录密码长度,保证长度符合要求才能跳出循环passwdlen = strlen(passwd);if(passwdlen<20&&passwdlen>0){break;}printf("密码长度请不要超过20,请重新输入:");}//将账号写到对应位置strcpy(buf+2,id);//将密码写到对应位置strcpy(buf+3+idlen,passwd);send(cfd, buf, sizeof(buf), 0);recv(cfd, buf, sizeof(buf), 0);printf("%s\n",buf+3+idlen);if(strcmp(buf+3+idlen,"登录成功")==0){strcpy(loadedid,id);loadedidlen = idlen;//将账号写到对应位置strcpy(buf+2,loadedid);printf("输入任意字符刷新>>");getchar();while(getchar()!=10);while(1){strcpy(buf+2,loadedid);system("clear");printf("****************************\n");printf("**********电子词典**********\n");printf("*****usr:%s*****\n",loadedid);printf("***********1.查询***********\n");printf("*********2.历史记录*********\n");printf("*********3.退出登录*********\n");printf("****************************\n");printf("请输入>>");scanf("%d",&opt);if(1 == opt){//查找*operatorPtr = 4;printf("请输入要查找的单词>>");scanf("%s",buf+3+loadedidlen);send(cfd, buf, sizeof(buf), 0);recv(cfd, buf, sizeof(buf), 0);printf("%s\n",buf+3+loadedidlen);}else if(2 == opt){//历史记录*operatorPtr = 5;//由于已经将用户id写入buf包中,只需将包发送即可send(cfd, buf, sizeof(buf), 0);recv(cfd, buf, sizeof(buf), 0);char *dataPtr = buf+3+loadedidlen;//应该循环接收,那么服务器发包应该在数据区写入结束标志while(*dataPtr){printf("%s\n",dataPtr);recv(cfd, buf, sizeof(buf), 0);}}else if(3 == opt){//退出登录//发送一个操作码为6的空包,向服务器提示该账号要退出登录//将记录已登录id的字符串清空,用于存储下一个登录用户id*operatorPtr = 6;send(cfd, buf, sizeof(buf), 0);recv(cfd, buf, sizeof(buf), 0);printf("%s\n",buf+3+loadedidlen);bzero(loadedid,sizeof(loadedid));loadedidlen = 0;break;}else{printf("输入不规范,亲人两行泪,请重新输入\n");}printf("输入任意字符刷新>>");getchar();while(getchar()!=10);bzero(buf,sizeof(buf));}}}else if(3 == opt){//退出//发送一个操作码为3的空包*operatorPtr = 3;send(cfd, buf, sizeof(buf), 0);break;}else{printf("输入不规范,亲人两行泪,请重新输入\n");}printf("输入任意字符刷新>>");getchar();while(getchar()!=10);}}
服务器测试文件:serDict.c:
#include<myhead.h>
#include<sqlite3.h>
#include "dict.h"int main(int argc, const char *argv[])
{//回收子进程signal(SIGCHLD,handler);//打开数据库sqlite3 * db;if(sqlite3_open("./dict.db", &db) != SQLITE_OK){printf("%d:sqlite3_open error %s\n",__LINE__, sqlite3_errmsg(db));return -1;}//初始化数据库,完成词典数据表的重载以及用户信息数据库的导入dict_init(db);struct sockaddr_in sin;socklen_t addrlen = sizeof(sin);int sfd;if((sfd = TCP_ser_set(&sin))<0){printf("服务器搭建失败");return -1;}pid_t pid;int newfd;while(1){if((newfd = accept(sfd,  (struct sockaddr*)&sin, &addrlen))<0){ERR_MSG("accept error");return 0;}pid = fork();if(pid == 0){		close(sfd);printf("这是子进程\n");child_operate(newfd, db);close(newfd);//关闭数据库if(sqlite3_close(db) != SQLITE_OK){printf("%d:sqlite3_close error %s\n",__LINE__, sqlite3_errmsg(db));return -1;		}exit(EXIT_SUCCESS);}close(newfd);}//关闭数据库if(sqlite3_close(db) != SQLITE_OK){printf("%d:sqlite3_close error %s\n",__LINE__, sqlite3_errmsg(db));return -1;		}close(sfd);return 0;
}
客户端测试文件:cliDict.c:
#include<myhead.h>
#include<sqlite3.h>
#include "dict.h"int cfd;//用户按下ctrl+c后给服务器发一个退出登录的包
void handlerINT(int signum){char buf[150] = " ";unsigned short *operatorPtr = (unsigned short*)buf;//发送一个操作码为3的空包,向服务器提示该账号要退出,退出功能中包含了退出登录*operatorPtr = 3;send(cfd, buf, sizeof(buf), 0);
}int main(int argc, const char *argv[])
{//用户按下ctrl+c后给服务器发一个退出登录的包signal(2,handlerINT);//调用TCP客户端搭建函数if((cfd = TCP_cli_set())<0){printf("客户端搭建失败\n");}cli_operate(cfd);close(cfd);	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/80176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android设备关机和重启分析

一、简介 重启(reboot) 使设备重新启动,即关闭设备并重新启动它。在重启期间,设备将经历完整的启动过程,包括重新加载操作系统和其他系统组件。这可以解决一些临时的系统问题,也可以应用系统更新或配置更改。 关机(shutdown) 使设备完全关闭,即停止设备的所有运行和…

06乐观锁与悲观锁

乐观锁与悲观锁 悲观锁: 悲观锁比较适合插入数据,简单粗暴但是性能一般 乐观锁: 比较适合更新数据, 性能好但是成功率低(多个线程同时执行时只有一个可以执行成功),还需要访问数据库造成数据库压力过大 模拟乐观锁实现流程 第一步: 数据库中增加商品表t_product并插入一条数…

MySQL索引使用

验证索引效率 在讲解索引的使用原则之前&#xff0c;先通过一个简单的案例&#xff0c;来验证一下索引&#xff0c;看看是否能够通过索引来提升 数据查询性能。在演示的时候&#xff0c;我们还是使用之前准备的一张表 tb_sku , 在这张表中准备了1000w 的记录。 这张表中id为主…

PostgreSQL 逻辑复制搭建

文章目录 前言1. 环境准备1.1 环境介绍1.2 发布端参数配置1.3 订阅端参数配置 2. 逻辑复制搭建2.1 创建逻辑复制用户2.2 发布节点造测试表2.3 发布节点授权2.4 创建 PUBLICATION2.5 订阅节点2.6 添加复制表2.7 删除复制任务 前言 本篇文章介绍 PostgreSQL 的搭建过程&#xff…

Linux抓包工具tcpdump

一、介绍 tcpdump是一个抓包工具&#xff0c;用于实时捕获和分析网络流量。它通常在unix和linux操作系统上使用。tcpdump能够捕获流经网络接口的数据包&#xff0c;并显示或保存它们以供进一步分析。它提供有关每个数据包的详细信息&#xff0c;包括源IP地址、目标IP地址、使用…

EDA(Exploratory Data Analysis)探索性数据分析

EDA(Exploratory Data Analysis)中文名称为探索性数据分析&#xff0c;是为了在特征工程或模型开发之前对数据有个基本的了解。数据类型通常分为两类&#xff1a;连续类型和离散类型&#xff0c;特征类型不同&#xff0c;我们探索的内容也不同。 1. 特征类型 1.1 连续型特征 …

每日一题(两数相加)

每日一题&#xff08;两数相加&#xff09; 2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 思路 思路&#xff1a; 由于链表从头开始向后存储的是低权值位的数据&#xff0c;所以只需要两个指针p1和p2&#xff0c;分别从链表的头节点开始遍历。同时创建一个新的指针new…

全球汽车安全气囊芯片总体规模分析

安全气囊系统是一种被动安全性的保护系统&#xff0c;它与座椅安全带配合使用&#xff0c;可以为乘员提供有效的防撞保护。在汽车相撞时&#xff0c;汽车安全气囊可使头部受伤率减少25%&#xff0c;面部受伤率减少80%左右。 汽车安全气囊芯片是整个系统的控制核心&#xff0c;并…

给微信小程序添加隐私协议

前些日子&#xff0c;微信官方针对用户的安全信息又进行了增强&#xff0c;这次更新几乎要求所有的小程序都需要进行整改&#xff0c;只要是涉及到用户的隐私的小程序都需要进行整改&#xff0c;这次整改是强制性的。 点开相关指引之后会跳转到下面的链接&#xff1a;参考链接…

【深度学习】Pytorch 系列教程(十一):PyTorch数据结构:3、变量(Variable)介绍

目录 一、前言 二、实验环境 三、PyTorch数据结构 0、分类 1、张量&#xff08;Tensor&#xff09; 2、张量操作&#xff08;Tensor Operations&#xff09; 3、变量&#xff08;Variable&#xff09; 一、前言 ChatGPT&#xff1a; PyTorch是一个开源的机器学习框架&am…

主题配置和 消息发送(一)KafkaTemplate 的使用

一、主题 1.1、配置主题 在应用程序上下文定义一个 KafkaAdmin Bean, 它可以自动将主题添加到代理。通过这个Bean可以将 每一个新建的主题 Topic 添加到应用程序上下文中。下面是一个简单的示例:也可以创建 TopicBuilder 类,使用它创建 Bean 更加简单。 @Bean public Kafka…

C++:string的模拟实现

目录 1.string的四大默认函数 1.1构造函数 1.2析构函数 1.3拷贝构造 1.4赋值运算符重载 2.访问string的三种方式 2.1[]访问 2.2迭代器访问 2.3范围for(本质是迭代器) 3.string相关功能的实现 3.1modify 3.2capacity 3.3access 3.4relations 3.5补充 4.补充 1.s…

C++之哈希表、哈希桶的实现

哈希表、哈希桶的实现 哈希概念哈希冲突哈希函数哈希冲突解决闭散列哈希表闭散列实现哈希表的结构哈希表的插入哈希表的查找哈希表的删除 开散列开散列概念哈希表的结构哈希表的插入哈希表的查找哈希表的删除 哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置…

git everything up-to-date解决方法

git push origin master 总是提示git everything up-to-date,原因是远端没有分支 . 操作如下:(1)查看当前分支名 git branch -av(2)git push --set-upstream origin (当前分支名)

Linux-相关操作

2.2.2 Linux目录结构 /&#xff1a;根目录&#xff0c;一般根目录下只存放目录&#xff0c;在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”&#xff0c;你其实是在告诉电脑&#xff0c;先从/&#xff08;根目录&#xff09;开始&#xf…

P2239 [NOIP2014 普及组] 螺旋矩阵

题目链接&#xff1a; 找到矩阵元素与 n , i , j \rm n, i, j n,i,j之间的关系&#xff0c;然后直接输出 #include <bits/stdc.h>using namespace std;int find(int n, int i, int j) {if (i 1) return j;if (j n) return i n - 1;if (i n) return 3 *n - 1 - j;if …

广州xx策划公司MongoDB恢复-2023.09.09

2023.09.08用户的MongoDB数据库被勒索病毒攻击&#xff0c;数据全部被清空。 提示&#xff1a; mongoDB的默认端口为27017&#xff0c;黑客通常通过全网段扫描27017是否开放判断是否是MongoDB服务器。一旦发现27017开放&#xff0c;黑客就会用空密码、弱密码尝试连接数据库。黑…

Mojo-SDK详细安装教程

Mojo-SDK安装 运行环境&#xff1a;windows11wsl2&#xff08;ubuntu1804&#xff09; 官方推荐&#xff1a;wsl2&#xff08;ubuntu2204&#xff09;&#xff0c;我下面是wsl2&#xff08;ubuntu1804&#xff09;&#xff0c;发现有些问题&#xff0c;不知道是不是ubuntu版本问…

opencv dnn模块 示例(16) 目标检测 object_detection 之 yolov4

博客【opencv dnn模块 示例(3) 目标检测 object_detection (2) YOLO object detection】 测试了yolov3 及之前系列的模型&#xff0c;有在博客【opencv dnn模块 示例(15) opencv4.2版本dnn支持cuda加速&#xff08;vs2015异常解决&#xff09;】 说明了如何使用dnn模块进行cuda…

kafka 3.5 主题分区ISR伸缩源码

ISR(In-sync Replicas)&#xff1a;保持同步的副本 OSR(Outof-sync Replicas)&#xff1a;不同步的副本。最开始所有的副本都在ISR中&#xff0c;在kafka工作的过程中&#xff0c;如果某个副本同步速度慢于replica.lag.time.max.ms指定的阈值&#xff0c;则被踢出ISR存入OSR&am…