c 语言tcp实现电子词典项目
这里要实现一个电子词典项目 现在有一个txt文件里面是一个英文词典 其中每一行的开头都是一个英文单词,英文单词之后有几个空格,空格之后是英文单词的解释(解释不换行)。需要在这个txt文件中查找要查询的单词 找到后输出单词的解释
需求 这个项目要实现以下几个需求
1.首先能够注册用户 要将注册的用户名和密码写到数据库usr表中
2.能够登录,需要到数据库usr表中查找用户名是否存在密码是否正确
3.登录后能够 查询单词,能够输出单词的解释,并将单词、查询时间、用户名输入到数据库record表中
4登录后能够显示用户查找单词的历史纪录,不同的用户他们的历史纪录是不同的,要从record表里筛选一下 ;
5.可以实现多个客户端同时访问一个服务端 同时查询单词
建表语句:
CREATE TABLE usr (name text primary key, pass text);
CREATE TABLE record (name text, date text, word text);
代码实现
client.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <sqlite3.h>
#define N 16
#define R 1 // user register
#define L 2 // user login
#define Q 3 // query word
#define H 4 // history record
#define L_not 5 //登录失败
#define R_success 6 //注册成功
void print1(){
printf("************************************\n");
printf("* 1.注册 2:登录 3:退出 *\n");
printf("************************************\n");
printf("please choose:");
}
void print2(){
printf("************************************\n");
printf("* 1.查找 2:历史记录 3:退出 *\n");
printf("************************************\n");
printf("please choose:");
}
int flag=0;
struct MSG{
char type;
char name[30];
char data[256];
};
struct MSG msg;
void do_register(int socketfd,struct MSG *msg){
char name[50];
char password[200];
printf("请输入用户名:");
scanf("%s",msg->name);
printf("请输入密码:");
scanf("%s",msg->data);
msg->type=R;
if(-1==send(socketfd,msg,sizeof(struct MSG),0)){
perror("send error ");
exit(0);
}
if(-1==recv(socketfd,msg,sizeof(struct MSG),0)){
perror("recv error ");
exit(0);
}
if(msg->type==R_success){
printf("注册成功\n");
}
return;
}
int login(int socketfd,struct MSG *msg){
;
memset(msg,0,sizeof(struct MSG));
printf("请输入用户名:");
scanf("%s",msg->name);
printf("请输入密码:");
scanf("%s",msg->data);
msg->type=L;//L代表登录
if(-1 == send(socketfd,msg, sizeof(struct MSG), 0)){
perror("send error");
exit(0);
}
memset(msg,0,sizeof(msg));
if(-1 == recv(socketfd, msg, sizeof(struct MSG), 0)){
perror("recv error");
exit(0);
}
if(msg->type==L){
flag=1;
printf("登录成功\n");
return 1;
}else if(msg->type==L_not){
printf("登录失败");
return 0;
}
}
void do_query(int socketfd,struct MSG *msg)
{
msg->type=Q;
printf("请输入单词\n");
scanf("%s",msg->data);
//printf("%s\n",msg->data);
if(-1 == send(socketfd, msg, sizeof(struct MSG), 0)){
perror("send error");
exit(0);
}
//printf("%s\n",msg->data);
if(-1 == recv(socketfd,msg, sizeof(struct MSG), 0)){
perror("recv error");
exit(0);
}
printf("解释:[%s]\n",msg->data);
return;
}
void do_history(int socketfd, struct MSG *msg)
{
msg->type=H;
printf("c开始%s\n",msg->name);
if(-1==send(socketfd,msg,sizeof(struct MSG),0)){
perror("send error");
exit(-1);
}
while(1){
recv(socketfd, msg, sizeof(struct MSG), 0);
if(strcmp(msg->data,"**OVER**")==0){
return;
}
printf("%s\n",msg->data);
}
}
int main(int argc,const char *argv[])
{
if (argc < 3)
{
printf("Usage : %s <ip> <port>\n", argv[0]);
exit(-1);
}
struct MSG msg;
memset(&msg,0,sizeof(msg));
int socketfd=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in serveraddr;
serveraddr.sin_family=AF_INET;
serveraddr.sin_addr.s_addr=inet_addr(argv[1]);
serveraddr.sin_port=htons(atoi(argv[2]));
if(connect(socketfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr))){
perror("connect error");
exit(0);
}
int choose=0;
while(1){
print1();
scanf("%d",&choose);
switch(choose){
case 1: do_register(socketfd,&msg);
break;
case 2:
if(login(socketfd,&msg)){
while(1){
print2();
scanf("%d",&choose);
switch(choose)
{
case 1:
do_query(socketfd, &msg);
break;
case 2:
do_history(socketfd, &msg);
break;
case 3:
close(socketfd);
exit(0);
}
}
}
break;
case 3: exit(0);
break;
}
}
return 0;
}
server.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <sqlite3.h>
#include <time.h>
#define N 16
#define R 1 // user register
#define L 2 // user login
#define Q 3 // query word
#define H 4 // history record
#define L_not 5 //登录失败
#define R_success 6 //注册成功
struct MSG{
char type;
char name[30];
char data[256];
};
void getdata(char *data)
{
time_t t;
struct tm *tp;
time(&t);
tp = localtime(&t);
sprintf(data, "%d-%d-%d %d:%d:%d", 1900+tp->tm_year, 1+tp->tm_mon, tp->tm_mday, \
tp->tm_hour, tp->tm_min, tp->tm_sec);
}
void do_register(int connectfd,struct MSG *msg,sqlite3 *db){
char sql[512]={0};
sprintf(sql,"insert into usr values('%s','%s')",msg->name,msg->data);
sqlite3_exec(db,sql,NULL,NULL,NULL);
msg->type=R_success;
if(-1==send(connectfd,msg,sizeof(struct MSG),0)){
perror("send error");
exit(0);
}
}
void login(int connectfd,struct MSG *msg,sqlite3 *db,int *flag){
char sql[500]={0};
char *errmsg, **result;
int nrow, ncolumn;
sprintf(sql,"select * from usr where name='%s' and pass='%s'",
msg->name,msg->data);
int row=0;
printf("sql:[%s]",sql);
printf("进入login\n");
if(sqlite3_get_table(db,sql,&result,&row,&ncolumn,&errmsg)!= SQLITE_OK){
printf("error:%s",errmsg);
exit(-1);
}
printf("row=%d\n",row);
if(row>=1) {
*flag=1;
if(-1 == send(connectfd,msg, sizeof(struct MSG), 0)){
perror("send error");
exit(0);
}
}else{
msg->type=L_not;
if(-1 == send(connectfd,msg, sizeof(struct MSG), 0)){
perror("send error");
exit(0);
}
}
}
void do_query(int connectfd,struct MSG *msg, sqlite3 *db)
{
int nbytes=0;
FILE *fp;
if(NULL==(fp=fopen("dict.txt","r"))){
perror("fopen error");
exit(-1);
}
char word[300]={0};
sprintf(word,"%s ",msg->data);
char buff[256]={0};
while(fgets(buff,256,fp)){
if(0==strncmp(buff,word,strlen(word))){
char *p;
p=buff;
while(*p!=' '){
p++;
//printf("%c",*p);
}
while(*p==' '){
p++;
//printf("%c",*p);
}
sprintf(msg->data,"%s",p);
printf("yfs:[%s]\n",p);
if(-1 == send(connectfd, msg, sizeof(struct MSG), 0)){
perror("send error");
exit(-1);
}
char sql[128]={0};
char date[100]={0};
getdata(date);
sprintf(sql,"INSERT INTO record VALUES('%s','%s','%s')",
msg->name,date,word);
sqlite3_exec(db,sql,NULL,NULL,NULL);
return;
}
}
printf("找不到该单词");
return;
}
int callback(void *arg,int column,char** f_value,char** f_name){
struct MSG msg;
memset(&msg,0,sizeof(struct MSG));
sprintf(msg.data,"%s|%s",f_value[1],f_value[2]);
if(-1==send(*(int *)arg,&msg,sizeof(struct MSG),0)){
perror("send error");
exit(-1);
}
return 0;
}
void do_history(int connectfd, struct MSG *msg, sqlite3 *db)
{
printf("name=%s\n",msg->name);
char sql[128]={0},*errmsg;
sprintf(sql,"select * from record where name='%s'",msg->name);
if(SQLITE_OK!=sqlite3_exec(db,sql,callback,&connectfd,&errmsg)){
printf("sqlite3_exec[%s]",errmsg);
exit(-1);
}
strcpy(msg->data, "**OVER**");
send(connectfd, msg, sizeof(struct MSG), 0);
}
int main(int argc,const char *argv[])
{
if (argc < 3)
{
printf("Usage : %s <ip> <port>\n", argv[0]);
exit(-1);
}
sqlite3 *my_db;
int ret = sqlite3_open("my.db", &my_db);
if(SQLITE_OK != ret){
printf("errcode:[%d] errstr:[%s]\n", ret, sqlite3_errmsg(my_db));
exit(-1);
}
struct MSG msg;
int listenfd=0;
int connectfd=0;
struct sockaddr_in serveraddr;
serveraddr.sin_family=PF_INET;
serveraddr.sin_addr.s_addr=inet_addr(argv[1]);
serveraddr.sin_port=htons(atoi(argv[2]));
if ((listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
{
perror("fail to socket");
exit(-1);
}
if(-1==(bind(listenfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)))){
perror("bind error");
}
if(listen(listenfd,5)<0){
perror("listen error");
exit(-1);
}
int pid;
while(1){
if((connectfd=accept(listenfd,NULL,NULL))<0){
perror("accept error");
exit(-1);
}
if((pid=fork())<0){
perror("fork error");
exit(0);
}
else if(pid==0){
printf("进入子进程\n");
while(recv(connectfd, &msg, sizeof(msg), 0) > 0){
printf("进入while循环\n");
printf("type:%d\n",msg.type);
int flag=0;//标志是否登录0为没登录
switch(msg.type){
case 1: do_register(connectfd,&msg,my_db);
break;
case L:
printf("进入L\n");
login(connectfd,&msg,my_db,&flag);
break;
case 3: do_query(connectfd,&msg, my_db);
break;
case 4: do_history(connectfd, &msg, my_db);
}
}
}else{
//父进程
}
}
return 0;
}
c 语言tcp实现电子词典项目相关推荐
- 基于C语言的网络电子词典
一.概述 本文章是来自于华清远见的一个基于C语言的网络电子词典项目,使用到了tcp协议的并发服务器设计.网络编程.文件I/O.数据库等多方面的知识.可以满足多用户同时登陆,用户登陆后可以查询单词及历 ...
- 【基于TCP 在线电子词典】
基于TCP 在线电子词典 项目功能 流程图 客户端 服务器端 功能实现 服务器 客户端 功能演示 注册功能 登录功能 查询单词功能 查询记录 注销登录(返回上级) 不允许重复登录 Ctrl + C注销 ...
- 便于查询增加索引文件 c语言,英汉电子词典小项目总结
最近通过所学习的c语言的知识,我们几个小伙伴们合作写了一个功能不完整的电子词典,有一些注意的地方,在这里总结下. 下面是电子词典的需求分析 C语言项目--查字典 [项目需求描述] 一.单词查询 给定文 ...
- 基于tcp和sqlite3数据库的电子词典项目
二十世界后半叶,伴随着社会的迅速发展与进步,以电子计算机为代表的现代科学技术获得了突飞猛进的发展并迅速和人们的日常生活结合在一起.计算机技术的发展和进步也使电子词典的诞生变得可能.虽然只有十来年的历史 ...
- 电子词典——项目(文件编程、网络编程、sqlte3数据库)
基于文件IO.网络编程.sqlite3数据库--电子词典 一.电子词典主功能介绍 1.注册:客户端发起注册请求,服务器检测到请求后从用户数据库中遍历是否有该账号存在,若没有则直接注册:若存在该账号则注 ...
- linux电子词典项目流程,毕业设计_linux下电子词典的设计与实现.doc
毕业设计_linux下电子词典的设计与实现 毕业设计(论文) 题目:Linux下电子词典的设计与实现 学 生 姓 名 学 号 201022080223 班 级 通信102202H班 所属院(系) 电子 ...
- 22.12.1 电子词典项目流程图
- 电子词典(基于TCP协议多进程通信和数据库)
项目:电子词典 项目要求: 登录注册功能,不能重复登录,重复注册.用户信息也存储在数据库中. 单词查询功能 历史记录功能,存储单词,意思,以及查询时间,存储在数据库 基于TCP,支持多客户端连接 采用 ...
- 华清远见22071电子词典小项目
电子词典 项目要求: 1. 登录注册功能,不能重复登录,重复注册 2. 单词查询功能 3. 历史记录功能,存储单词,意思,以及查询时间 4. 基于TCP,支持多客户端连接 5. 采用数据库保存用户信息 ...
- 基于 TCP协议和sqlite3数据库的网络电子词典(个人项目)
一.开发环境:Ubuntu 16.04 二.项目描述: 基于TCP协议的并发服务器设计,采用sql数据库进行数据存储,文件保存历史查询数据,能满足多用户同时登陆,实现用户的注册.登录以及退出,登录成功 ...
最新文章
- iOS蓝牙开发---CoreBluetooth[BLE 4.0] 初级篇[内附Demo地址]
- 计算 sigmoid 函数的导数
- python基础教程:变量的使用
- 前、中、后缀表达式概述及转换+栈的计算器原理及代码分析(含完整源码)
- 处理时间_7_60个Mysql日期时间函数汇总
- windows安装vue脚手架(vue-cli)及vue ui无反应,npm i -g @vue/cli报错解决方案
- 502 bad gateway php-fm,php+nginx 上传大文件 502 Bad Gateway
- 17大主链均狂跌国内项目却看涨, 本周不可不知的7组榜单 | 数据周榜
- 课堂小结:返回一个整数数组所有子数和的最大值
- 一本通1598【 例 2】最大连续和
- 计算机课用什么做课件,电脑做ppt用什么软件
- js混淆还原工具_技术分享:几种常见的JavaScript混淆和反混淆工具分析实战【转】...
- win10电脑磁盘占用百分百,电脑优化
- STM32计数器/定时器之PWM脉宽捕获+超声波传感器测距
- 几何画板添加背景图片方法
- 百度、高德、谷歌、火星、wgs84(2000)地图坐标相互转换的JS实现
- 2021年中式面点师(高级)报名考试及中式面点师(高级)模拟试题
- 在windows下实时监控、接受文件变化小工具
- SSE(Server-sent Events)实现Web消息推送(SpringBoot)
- perl 处理 回车 换行符