代码中的ip地址写的都是回环测试ip,如果要在两个电脑之间,请修改代码中ip地址一行。另外查询单词的dict.txt文件您需要自己准备,然后修改路径。
写的不好,您多担待。

服务器部分:

头文件声明(服务器)

#ifndef _SERVER_H
#define _SERVER_H
#include<stdio.h>
#include<time.h>
#include<sqlite3.h>
#include<stdlib.h>
#include<unistd.h>
#include<strings.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define N 256
#define M 1024//用于缓冲区
typedef struct msgg{unsigned int cmd;//标志请求char name[N];//用户名char password[N];//密码
}msg;
typedef struct worr{unsigned int cmd;//标志请求char word[N];//所要查询的单词char time[N];//查询时间char explain[N];char name[N];
}data;
typedef struct sockaddr *SA;
int enroll(msg *pack);
int enter(msg *pack);
int history(data *word);
int init_network();
int look(data *word);
int sec(msg *pack);
int sec1(data *word);
#endif

主函数(服务器)

#include "server.h"int main(int argc, char *argv[])
{int lis_fd;int soc_fd;int ret;struct sockaddr_in cliaddr;msg pack;data word;socklen_t addrlen = 0;char buf[M] = "\0";lis_fd = init_network();if (-1 == lis_fd){printf("init network fail\n");return -1;}else{printf("init succeed, have fun ^0^\n");}bzero(&pack, sizeof(pack));while (1){printf("等待接收...\n");soc_fd = accept(lis_fd, (SA)&cliaddr, &addrlen);if (-1 == soc_fd){perror("accept");return -1;}while (1){if (recv(soc_fd, buf, M, 0) > 0){printf("接收信息成功\n");memcpy(&pack, buf, sizeof(pack));printf("%s %s\n",pack.name, pack.password);ret = sec(&pack);if (1 == ret){bzero(buf, sizeof(buf));strcpy(buf, "ok");send(soc_fd, buf, M, 0);printf("注册成功信息已发出\n");break;}else if (-1 == ret){bzero(buf, sizeof(buf));strcpy(buf, "no");send(soc_fd, buf, M, 0);printf("注册失败信息已发出\n");break;}else if (2 == ret){bzero(buf, sizeof(buf));strcpy(buf, "ok");send(soc_fd, buf, M, 0);printf("登陆成功信息已发出\n");bzero(buf, sizeof(buf));while(recv(soc_fd, buf, M, 0) > 0){printf("接收数据包成功\n");memcpy(&word, buf, sizeof(word));if (0 == strncmp(word.word, "#", 1))break;ret = sec1(&word);if (1 == ret){printf("查到了此单词\n");bzero(buf, sizeof(buf));strcpy(buf, "ok");send(soc_fd, buf, M, 0);printf("查询成功信息已发出\n");bzero(buf, sizeof(buf));memcpy(buf, &word, sizeof(word));send(soc_fd, buf, M, 0);}else if (-1 == ret){printf("查不到此单词\n");bzero(buf, sizeof(buf));strcpy(buf, "no");send(soc_fd, buf, M, 0);printf("查询失败信息已发出\n");}else if (2 == ret){sqlite3 *db; int ret;char **result;int row, column;char *errmsg;char sql[M] = "\0";char buf[M] = "\0";int set[2] = {0};ret = sqlite3_open("my.db", &db);if (ret != SQLITE_OK){printf("数据库打开失败\n");return -1;}else{printf("数据库打开成功\n");}sprintf(sql, "select * from %s;",pack.name);ret = sqlite3_get_table(db, sql, &result, &row, &column, &errmsg);if (ret != SQLITE_OK){printf("数据库语句执行失败\n");sqlite3_free_table(result);sqlite3_close(db);break;}else{int i, j, k=0;printf("数据库语句执行成功\n");for (i=0; i<row; i++){for (j=0; j<=column; j++){send(soc_fd, result[k++], N , 0);}}sqlite3_free_table(result);sqlite3_close(db);break;}}
}
break; }else if (-2 == ret){bzero(buf, sizeof(buf));strcpy(buf, "no");send(soc_fd, buf, M, 0);printf("登陆失败信息已发出\n");continue;}}else{printf("接收失败或者用户已下线\n");break; }}close(soc_fd);}}

功能函数(服务器)


#include "server.h"
unsigned short port = 8888;
int init_network()
{int lis_fd;int ret;struct sockaddr_in seraddr; lis_fd = socket(AF_INET, SOCK_STREAM, 0);if (-1 == lis_fd){perror("socket");return -1;}seraddr.sin_family = AF_INET;seraddr.sin_port = htons(port);seraddr.sin_addr.s_addr = htonl(INADDR_ANY);ret = bind(lis_fd, (SA)&seraddr, sizeof(seraddr));if (-1 == ret){perror("bind");return -1;}listen(lis_fd, 5);return lis_fd;
}int enroll(msg *pack)
{sqlite3 *db; int ret;char *errmsg;char sql[M] = "\0";char buf[M] = "\0";ret = sqlite3_open("my.db", &db);if (ret != SQLITE_OK){printf("数据库打开失败\n");return -1;}else{printf("数据库打开成功\n");}sprintf(sql, "create table if not exists user(name text primary key, password text)");ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);if (ret != SQLITE_OK){printf("数据库语句执行失败\n");return -1;}else{printf("数据库语句执行成功\n");}bzero(sql, sizeof(sql));sprintf(sql, "insert into user values('%s','%s')", pack->name, pack->password);ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);if (ret != SQLITE_OK){printf("信息载入失败\n");sqlite3_close(db);return -1;}else{printf("信息载入成功\n");printf("注册成功\n");sqlite3_close(db);return 1;}
}int enter(msg *pack)
{sqlite3 *db; int ret;char **result;int row, column;char *errmsg;char sql[M] = "\0";char buf[M] = "\0";ret = sqlite3_open("my.db", &db);if (ret != SQLITE_OK){printf("数据库打开失败\n");return -1;}else{printf("数据库打开成功\n");}sprintf(sql, "select name,password from user where name='%s';", pack->name);ret = sqlite3_get_table(db, sql, &result, &row, &column, &errmsg);if (ret != SQLITE_OK){printf("数据库语句执行失败\n");sqlite3_free_table(result);sqlite3_close(db);return -2;}else{printf("数据库语句执行成功\n");if (0 == strcmp(result[3], pack->password)){sqlite3_free_table(result);sqlite3_close(db);return 2;}elsereturn -2;}
}int sec(msg *pack)
{int ret;msg pack1;pack1 = *pack;switch (pack->cmd) {case 1:ret = enroll(&pack1);break;case 2:ret = enter(&pack1);break;}return ret;
}int history(data *word)
{sqlite3 *db; int ret;char *errmsg;char sql[M] = "\0";char buf[M] = "\0";ret = sqlite3_open("my.db", &db);if (ret != SQLITE_OK){printf("数据库打开失败\n");return -1;}else{printf("数据库打开成功\n");}sprintf(sql, "create table if not exists %s(word text, time text)",word->name);ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);if (ret != SQLITE_OK){printf("数据库语句执行失败\n");return -1;}else{printf("数据库语句执行成功\n");}bzero(sql, sizeof(sql));sprintf(sql, "insert into %s values('%s','%s')", word->name, word->word, word->time );ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);if (ret != SQLITE_OK){printf("历史信息载入失败\n");sqlite3_close(db);return -1;}else{printf("历史信息载入成功\n");sqlite3_close(db);return 1;}}int look(data *word)
{printf("%s\n",word->word);word->time[strlen(word->time)-1] = '\0';history(word);char buf[M] = "\0";FILE *fp;char *buff = buf;char word1[N] = "\0";int i = 0;if ((fp = fopen("dict.txt", "r")) == NULL){perror("fopen");return -1;}else{printf("查询中\n");}strcpy(word1, word->word);while (word1[i] != '\0'){i++;}word1[i] = ' ';word1[i+1] = '\0';while (fgets(buf, M, fp) != NULL){if (!strncmp(buf, word1, i))break;}if (!strncmp(buf, word1, i)){while (*(++buff) != ' '){continue;}while (*(++buff) == ' ')continue;bzero(word->explain, sizeof(word->explain));strcpy(word->explain, buff);fclose(fp);return 1;}else{printf("没找到\n");fclose(fp);return -1;}
}int sec1(data *word)
{int ret;switch (word->cmd) {case 1:ret = look(word);break;case 2:ret = 2;break;}return ret;
}

makefile(服务器)

.PHONY:clean
OBJ = server
OBJS = server.o fun_ser.o server.h
cc = gcc
flag = -c -o
$(OBJ):$(OBJS)@$(cc) $^ -lsqlite3 -o $@
%.o:%.c@$(cc) $< $(flag) $@
clean:rm $(OBJS) $(OBJ)

客户端部分:

头文件(客户端)

```
#ifndef _CLIENT_H
#define _CLIENT_H
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<unistd.h>
#include<strings.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define N 256
#define M 1024//用于缓冲区
typedef struct msgg{unsigned int cmd;//标志请求char name[N];//用户名char password[N];//密码
}msg;
typedef struct worr{unsigned int cmd;//标志请求char word[N];//所要查询的单词char time[N];//查询时间char explain[N];char name[N];
}data;
typedef struct sockaddr *SA;
msg enroll();
msg enter();
data history(msg *pack);
int init_connect();
data look();
int menu1();
int menu2();
void quit();
int sec();
#endif

主函数(客户端)

#include"client.h"int main(int argc, char *argv[])
{while (1){int soc_fd;int i = 0;int ret;char buf[M] = "\0";msg pack;data word;int set[2] = {0};soc_fd = init_connect();if (-1 == soc_fd){printf("连接失败\n");}else{printf("连接成功^0^\n");}menu1();ret = sec();switch (ret){case 1:pack = enroll();//注册;bzero(buf, sizeof(buf));memcpy(buf, &pack,sizeof(pack));send(soc_fd, buf, M, 0);//将信息发送给服务器bzero(buf, sizeof(buf));recv(soc_fd, buf, M, 0);//从服务器那接受确认信息if (strncmp(buf, "ok", 2) == 0){printf("注册成功\n");break;}else if (strncmp(buf, "no", 2) == 0){printf("注册失败\n");break;}case 2:pack = enter();//登陆;bzero(buf, sizeof(buf));memcpy(buf, &pack,sizeof(pack));send(soc_fd, buf, M, 0);//将信息发送给服务器bzero(buf, sizeof(buf));recv(soc_fd, buf, M, 0);//从服务器那接受确认信息if (strncmp(buf, "ok", 2) == 0){printf("登陆成功\n");menu2();ret = sec();switch (ret){case 1:while (1){word = look();if (strncmp(word.word, "#", 1) == 0)break;strcpy(word.name, pack.name);printf("%s",word.time);bzero(buf, sizeof(buf));memcpy(buf, &word, sizeof(word));send(soc_fd, buf, M, 0);//将信息发送给服务器bzero(buf, sizeof(buf));recv(soc_fd, buf, M, 0);//从服务器那接受确认信息if (strncmp(buf, "ok", 2) == 0){bzero(buf, sizeof(buf));recv(soc_fd, buf, M, 0);memcpy(&word, buf, sizeof(word));printf("%s\n",word.explain);}else if (strncmp(buf, "no", 2) == 0){printf("找不到此单词\n");}}case 2:word = history(&pack);bzero(buf, sizeof(buf));memcpy(buf, &word, sizeof(word));send(soc_fd, buf, M, 0);//将信息发送给服务器i=0;bzero(buf, sizeof(buf));while (1){if(recv(soc_fd, buf, N, 0) > 0){printf("%-8s", buf);i++;if (i%2 == 0)printf("\n");}else break;}case 3:continue;}break;
}else if (strncmp(buf, "no", 2) == 0){printf("登陆失败\n");break;}case 3:quit();}}}

功能函数(客户端)

include”client.h”

unsigned short port = 8888;

int init_connect()
{
int soc_fd;
int ret;
struct sockaddr_in seraddr;

soc_fd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == soc_fd)
{perror("socket");return -1;
}
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(port);
seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");ret = connect(soc_fd, (SA)&seraddr, sizeof(seraddr)) ;
if (-1 == ret)
{perror("connect");return -1;
}
else
{return soc_fd;
}

}

int menu2()
{
printf(“****************************\n”);
printf(“* 1.查询单词 2.历史记录 3.退出 *\n”);
printf(“****************************\n”);
}

int menu1()
{
printf(“****************************\n”);
printf(“* 1.注册 2.登陆 3.退出 *****\n”);
printf(“****************************\n”);
}

int sec()
{
int i;
printf(“请选择:\n”);
scanf(“%d”,&i);
getchar();
return i;
}

msg enroll()
{
msg pack;
char buf[N] = “\0”;
pack.cmd = 1;
printf(“注册\n”);
printf(“请输入用户名:\n”);
fgets(buf, N, stdin);
buf[strlen(buf)-1] = ‘\0’;
strcpy(pack.name, buf);
bzero(buf, N);
printf(“请输入密码:\n”);
fgets(buf, N, stdin);
buf[strlen(buf)-1] = ‘\0’;
strcpy(pack.password, buf);
return pack;
}

msg enter()//登陆
{
msg pack;
char buf[N] = “\0”;
pack.cmd = 2;
printf(“登陆\n”);
printf(“请输入用户名:\n”);
fgets(buf, N, stdin);
buf[strlen(buf)-1] = ‘\0’;
strcpy(pack.name, buf);
bzero(buf, N);
printf(“请输入密码:\n”);
fgets(buf, N, stdin);
buf[strlen(buf)-1] = ‘\0’;
strcpy(pack.password, buf);
return pack;
}

void quit()
{
printf(“再见,拜拜,欢迎下次再来-0-\n”);
exit(0);
}

data look()
{
data word;
time_t t;
char buf[N] = “\0”;
word.cmd = 1;
printf(“查询\n”);
printf(“请输入你需要查询的单词:”);
bzero(buf,N);
fgets(buf, N, stdin);
buf[strlen(buf)-1] = ‘\0’;
strcpy(word.word,buf);
t = time(NULL);
strcpy(word.time,asctime(localtime(&t)));
return word;

}

data history(msg *pack)
{
data word;
word.cmd = 2;
strcpy(word.name,pack->name);
return word;
}

makefile(客户端)

.PHONY:clean
OBJ = client
OBJS = client.o fun_cli.o client.h
cc = gcc
flag = -c -o
(OBJ):(OBJ):(OBJS)
@(cc)(cc) ^ -o @@@ %.o:%.c @(cc) <<script type="math/tex" id="MathJax-Element-14">< </script>(flag) @clean:rm@ clean: rm (OBJS) $(OBJ)
“`

C语言 简单的在线电子词典相关推荐

  1. 【基于TCP 在线电子词典】

    基于TCP 在线电子词典 项目功能 流程图 客户端 服务器端 功能实现 服务器 客户端 功能演示 注册功能 登录功能 查询单词功能 查询记录 注销登录(返回上级) 不允许重复登录 Ctrl + C注销 ...

  2. C语言实现电子辞典(电子词典)

    C语言实现电子辞典(电子词典) 源码链接:https://download.csdn.net/download/weixin_44144366/87547747 #include <stdio. ...

  3. c语言简单的英汉词典系统

    大一上学期作业 当时找了很多资料没找到所以传一个自己写的 写的不好希望指正不足 #include <stdio.h> #include <stdlib.h> #include ...

  4. Python 在线电子零售公司销售数据(Online Retail | Kaggle)关联规则分析(Apriori算法)

    引言: 本文使用python语言完成了在线电子零售公司的跨国交易数据集的数据分析与可视化.根据关联规则原理设计实现了基于Apriori算法的关联规则挖掘程序并将程序封装.使用封装好的关联规则挖掘程序对 ...

  5. go语言实现简单的在线词典

    go语言实现简单的在线词典 这里使用火山翻译 1. Chome浏览器打开火山翻译,右键检查 输入一个单词进行翻译,发起请求,查看Network中的Headers是post请求的,并且Response里 ...

  6. 电子英汉词典c语言程序设计报告,英汉电子词典设计报告_设计_C语言_C语言程序设计.doc...

    英汉电子词典设计报告_设计_C语言_C语言程序设计 课程设计 课程名称 :C语言程序课程设计 题目名称 :电子英汉词典 学生学院 :电气信息学院 专业班级 :自动化1101 学 号 :20110102 ...

  7. c语言词典课程设计报告,英汉电子词典C语言课程设计

    英汉电子词典C语言课程设计 C 语言程序设计 课程设计(论文)题目: 英汉电子词典 院(系): 专业班级: 学 号: 学生姓名: 指导教师: 教师职称: 起止时间: 课程设计(报告)任务及评语院(系) ...

  8. 基于C语言的网络电子词典

    一.概述  本文章是来自于华清远见的一个基于C语言的网络电子词典项目,使用到了tcp协议的并发服务器设计.网络编程.文件I/O.数据库等多方面的知识.可以满足多用户同时登陆,用户登陆后可以查询单词及历 ...

  9. 便于查询增加索引文件 c语言,英汉电子词典小项目总结

    最近通过所学习的c语言的知识,我们几个小伙伴们合作写了一个功能不完整的电子词典,有一些注意的地方,在这里总结下. 下面是电子词典的需求分析 C语言项目--查字典 [项目需求描述] 一.单词查询 给定文 ...

  10. 电子科大专科c语言作业1,电子科大15春《C语言(专科)》在线作业试卷.docx

    电子科大 15 春< C 语言(专科)>在线作业 一.单选题(共20 道试题,共100 分.) 1.对于 int*p;inta[];p=a;的合法运算 () a++; p=a;p++; 相 ...

最新文章

  1. 设计模式学习笔记(1)之单例模式
  2. win10磁盘检查命令
  3. c++可视化_数据可视化——如何让你的信息图被记住
  4. 售前工程师的成长---一个老员工的经验之谈(三)
  5. ruby on rails 之图片压缩
  6. 批量自动化配置Dell服务器idrac管理口IP
  7. chown r mysql var_Mysql 常用命令
  8. MATLAB对表达式进行降幂排列,MATLAB上机答案.doc
  9. 基于WEB的PDF打印——浏览器中静默打印PDF文件
  10. 手把手教你运用JAVA爬虫技术爬取小说
  11. fleck 客户端_关于C#使用Fleck 的websocket问题
  12. 看不到工作组的其他计算机_就这一次,从现实世界的角度去理解计算机领域的知识(给新手)...
  13. 记一次对Pixiv日榜的爬虫
  14. iperf for linux 使用方法
  15. 放榜时刻!RT-Thread应用创新大赛圆满收官
  16. 考试系统(uniapp)第二节 (考试试题)
  17. 计算机类期刊 SCI 、EI 收录,核心期刊目录
  18. 清华师姐网盘大曝光(整整400集python学习资料,真香)
  19. Imagination的IMG CXT GPU荣获2022亚洲金选奖年度最佳IP/处理器
  20. ResNet变体(wide residual network,ResNext,DenseNet,MobileNet,ShuffleNet, Dual path Network)

热门文章

  1. 搞定所有的跨域请求问题 : jsonp CORS
  2. vue如何设置视频封面_vue设置视频封面教程 vue如何修改标题
  3. 微信小程序蓝牙连接TSPL打印机打印图片思路
  4. java batik_Java Batik框架画SVG图 JSVGCanvas
  5. RedHat 7 更换 yum 源为 CentOS 或网易镜像源
  6. TopJUI Combobox 联动
  7. 自动驾驶仿真:VTD的SCP命令详解
  8. Python 打包的EXE文件反编译1|EXE文件反编译为pyc文件
  9. cloverconfig机型修改_Clover的Config新手设置教程
  10. 无源三端口器件特性分析-《微波工程》