网络编程练手小项目---英英词典
实现的功能
注册
登录
查询单词
查询历史记录
大概思路
搭建tcp服务器,通过IO多路复用实现并发(伪并发)。注册:接收到客户端发来的数据,建立一张用户表,将注册信息存储到数据库的用户表中,不过存入之前要判断是否重名 数据可以是一个结构体 可以设置结构中的一个成员为客户端发送过来的指令 客户端根据指令判断是注册 登录 等等。登录同理,不过这时候服务器对数据库表的操作为查询,有注册成功 没有则做其他处理。登录成功后修改登录状态为在线 这个标志位同样存储在结构体中。查询单词 历史记录等同样是对数据库进行查找、插入操作等 这里就不作过多赘述。
下面直接将这个练手的小项目的详细代码分享给大家 希望能帮助到刚入门的你 博客写的不是很规范将就看看吧 内容中若有错误的地方还请指正
定义的结构体:
typedef struct message_user{char name[20];char passwd[20];char wordname[20];char meaning[128];int flags;//判断发送的指令int states;//用户是否在线int ifuser;//用户名是否存在int loginflags;// 1成功 2 密码错误 3 用户名不存在int ifinsearch;//是否查找到对应单词 0没有 1查到int histroyflags;//1 byuser 2 bywordnamechar result[48][128];//历史记录int num;//查询的记录条数int column;//字段个数
}info;
注册
int Register(int connfd,sqlite3 *db)
{char buf[128] = {0};int ret = sqlite3_open("wmk.db",&db);if(ret != SQLITE_OK){printf("%s\n",sqlite3_errmsg(db));return -1;}strcpy(buf,"create table if not exists user(name char[10],passwd char[20]);");char *errmsg = NULL;ret = sqlite3_exec(db,buf,NULL,NULL,&errmsg);if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}
b: bzero(buf,sizeof(buf));sprintf(buf,"select * from user where name='%s';",message.name);char **result;int num = 0;int column = 0;if(sqlite3_get_table(db,buf,&result,&num,&column,&errmsg) != SQLITE_OK){printf("%s\n",errmsg);return -1;}if(num > 0){message.ifuser = 1;//用户名已存在}else{message.ifuser = 0;//用户名不存在bzero(buf,sizeof(buf));sprintf(buf,"insert into user values('%s','%s');",message.name,message.passwd);if(sqlite3_exec(db,buf,NULL,NULL,&errmsg) < 0){printf("%s\n",errmsg);return -1;}}ret = write(connfd,&message,sizeof(message));if(ret < 0){perror("write");return -1;}if(message.ifuser == 1){ret = read(connfd,&message,sizeof(message));goto b;}printf("注册\n");return 0;}
登录
int Login(int connfd,sqlite3 *db)
{char buf[128] = {0};int ret = sqlite3_open("wmk.db",&db);if(ret != SQLITE_OK){printf("%s\n",sqlite3_errmsg(db));return -1;}
a: sprintf(buf,"select * from user where name='%s' and passwd='%s';",message.name,message.passwd);char *errmsg = NULL;char **result;int num = 0;int column = 0;ret = sqlite3_get_table(db,buf,&result,&num,&column,&errmsg);if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}if(num){message.loginflags = 1;message.states = 1;//表示在线//用户名存在且密码正确if(write(connfd,&message,sizeof(message)) < 0){perror("write");return -1;}}else{num = 0;bzero(buf,sizeof(buf));sprintf(buf,"select *from user where name='%s';",message.name);ret =sqlite3_get_table(db,buf,&result,&num,&column,&errmsg);printf("%d\n",ret);if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}//用户名存在密码错误if(num){message.loginflags = 2;if(write(connfd,&message,sizeof(message)) < 0){perror("write");return -1;}if(read(connfd,&message,sizeof(message)) < 0){perror("read");return -1;}goto a;}else{// 用户名不存在message.loginflags = 3;if(write(connfd,&message,sizeof(message)) < 0){perror("write");return -1;}if(read(connfd,&message,sizeof(message)) < 0){perror("write");return -1;}goto a;}}printf("登陆\n");return 0;
}
查询单词
int Insearch(int connfd,sqlite3 *db)
{if(message.states != 1){if(write(connfd,&message,sizeof(message)) < 0){perror("write");return -1;}return 0;}char buf[128] = {0};char *errmsg = NULL;char **result;int num = 0;int column = 0;int ret = sqlite3_open("wmk.db",&db);if(ret != SQLITE_OK){sqlite3_errmsg(db);return -1;}strcpy(buf,"create table if not exists word(word char[128],meaning char[512]);");ret = sqlite3_exec(db,buf,NULL,NULL,&errmsg);if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}bzero(buf,sizeof(buf));strcpy(buf,"create table if not exists record(name char[20],time char[128]);");ret = sqlite3_exec(db,buf,NULL,NULL,&errmsg);if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}bzero(buf,sizeof(buf));strcpy(buf,"create table if not exists wrecord(wordname char[20],time char[128]);");ret = sqlite3_exec(db,buf,NULL,NULL,&errmsg);if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}bzero(buf,sizeof(buf));sprintf(buf,"select * from word where word='%s';",message.wordname);//查找单词ret = sqlite3_get_table(db,buf,&result,&num,&column,&errmsg);if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}if(num == 0){message.ifinsearch = 0;if(write(connfd,&message,sizeof(message)) < 0 ){perror("write");return -1;}}else{bzero(buf,sizeof(buf));time_t t;time(&t);message.ifinsearch = 1;//查询到单词strcpy(message.meaning,result[3]);if(write(connfd,&message,sizeof(message)) < 0){perror("write");return -1;}sprintf(buf,"insert into record values('%s','%s');",message.name,ctime(&t));ret = sqlite3_exec(db,buf,NULL,NULL,&errmsg);//将查询用户记录到单词用户表中,记录时间if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}bzero(buf,sizeof(buf)) ;sprintf(buf,"insert into wrecord values('%s','%s');",message.wordname,ctime(&t));ret = sqlite3_exec(db,buf,NULL,NULL,&errmsg);//将查询记录插入到单词记录表中 记录当前时间if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}}printf("查询单词\n");return 0;
}
历史记录(查询的时候插入对应的表中 只需将表中的数据打印出来)
int Histroy_r(int connfd,sqlite3 *db)
{char **result;char *errmsg = NULL;int num = 0;int column = 0;char buf[128] = {0};int ret = 0;ret = sqlite3_open("wmk.db",&db);if(ret != SQLITE_OK){sqlite3_errmsg(db);return -1;}if(message.histroyflags == 1)//by user{strcpy(buf,"select * from record;");ret = sqlite3_get_table(db,buf,&result,&num,&column,&errmsg);if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}message.num = num;message.column = column;bzero(message.result,sizeof(message.result));for(int i = 0;i<num * column;i++){strcpy(message.result[i],result[column + i]);}if(write(connfd,&message,sizeof(message)) < 0){perror("write");return -1;}/*for(int i = 0;i < num;i++){for(int j=0;j<column;j++,result++){printf("%s",*(result + 2));}//puts("\n");}*/}else{strcpy(buf,"select * from wrecord;");ret = sqlite3_get_table(db,buf,&result,&num,&column,&errmsg);if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}message.num = num;message.column = column;bzero(message.result,sizeof(message.result));for(int i = 0;i<num * column;i++){strcpy(message.result[i],result[column + i]);}if(write(connfd,&message,sizeof(message)) < 0){perror("write");return -1;}}printf("查找历史记录\n");return 0;
}
下面是整个客户端的代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <unistd.h>
typedef struct message_user{char name[20];char passwd[20];char wordname[20];char meaning[128];int flags;//判断发送的指令int states;//用户是否在线 0 out 1 onlineint ifuser;//判断注册是否重名int loginflags;// 1成功 2 密码错误 3 用户名不存在int ifinsearch;//是否查找到对应单词 0没有 1查到int histroyflags;//1 byuser 2 bywordnamechar result[48][128];//历史记录int num;//查询的记录条数int column;//字段个数
}info;
info message = {0};
int Register(int sockfd)
{
a: printf("请输入用户名:\n");fgets(message.name,sizeof(message.name),stdin);message.name[strlen(message.name) - 1] = '\0';printf("%s\n",message.name);printf("请输入密码:\n");fgets(message.passwd,sizeof(message.passwd),stdin);message.passwd[strlen(message.passwd) - 1] = '\0';printf("%s\n",message.passwd);if(write(sockfd,&message,sizeof(message)) < 0){perror("write");return -1;}if(read(sockfd,&message,sizeof(message)) < 0){perror("read");return -1;}if(message.ifuser == 1){printf("用户名已存在请重新输入\n");goto a;}else{printf("注册成功\n");}sleep(3);system("clear");return 0;
}
int Login(int sockfd)
{
b: printf("请输入用户名:\n");fgets(message.name,sizeof(message.name),stdin);message.name[strlen(message.name) - 1] = '\0';
c: printf("请输入密码:\n");fgets(message.passwd,sizeof(message.passwd),stdin);message.passwd[strlen(message.passwd) - 1] = '\0';if(write(sockfd,&message,sizeof(message)) < 0){perror("write");return -1;}if(read(sockfd,&message,sizeof(message)) < 0){perror("write");return -1;}switch(message.loginflags){case 1:printf("登陆成功\n");sleep(3);break;case 2:{printf("密码错误,请重新输入\n");goto c;break;}case 3:{printf("用户名不存在,请重新输入\n");goto b;break;}}system("clear");return 0;}
int Insearch(int sockfd)
{printf("请输入你要查询的单词:\n");fgets(message.wordname,sizeof(message),stdin);message.wordname[strlen(message.wordname) - 1] = '\0';if(write(sockfd,&message,sizeof(message)) < 0){perror("write");return -1;}if(read(sockfd,&message,sizeof(message)) < 0){perror("write");return -1;}if(message.states != 1){printf("您还未登陆,请先登陆\n");message.flags = 2;Login(sockfd);}else{if(message.ifinsearch == 0){printf("单词库没有此单词\n");sleep(3);system("clear");}else{printf("%s:%s\n",message.wordname,message.meaning);sleep(3);system("clear");}}return 0;}
int Histroy_r(int sockfd)
{
d:if(message.states != 1){message.flags = 2;printf("您还未登陆,请登陆\n");Login(sockfd);}else{int n = 0;printf("***1.by user***2.by wordname***\n");scanf("%d",&n);getchar();if(n==1){message.histroyflags = 1;if(write(sockfd,&message,sizeof(message)) < 0){perror("write");return -1;}if(read(sockfd,&message,sizeof(message)) < 0){perror("write");return -1;}for(int i = 0;i < message.num;i++){printf("%s 在 %s查看了单词\n",*(message.result + 2*i),*(message.result+(2*i + 1)));}}else if(n == 2){message.histroyflags = 2;if(write(sockfd,&message,sizeof(message)) < 0){perror("write");return -1;}if(read(sockfd,&message,sizeof(message)) < 0){perror("write");return -1;}for(int i = 0;i < message.num;i++){printf("%s 在 %s时被查询了\n",*(message.result + 2*i),*(message.result+(2*i + 1)));}}else{printf("输入错误,请重新输入\n");goto d;}}sleep(3);system("clear");return 0;}
int main(int argc, char *argv[])
{ int sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd < 0){perror("sockfd");return -1;}printf("%d\n",sockfd);struct sockaddr_in saddr;bzero(&saddr,sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_addr.s_addr = inet_addr("192.168.153.128");saddr.sin_port = htons(8888);int ret = connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));if(ret < 0){perror("connect");return -1;}printf("connect success\n");while(1){printf("-------欢迎来到英英词典--------\n");printf("-----1.注册-----2.登陆-----3.查询单词-----4.查看历史记录-----\n");
a: scanf("%d",&message.flags);getchar();switch(message.flags){case 1:Register(sockfd);break;case 2:Login(sockfd);break;case 3:Insearch(sockfd);break;case 4:Histroy_r(sockfd);break;default:printf("输入错误,请重新输入\n");goto a;}// printf("++%d\n",message.states);}close(sockfd);return 0;
}
如果都看到这儿了希望不要吝啬您的赞噢 您的阅读点赞是我能够继续坚持的最大动力
网络编程练手小项目---英英词典相关推荐
- C# Socket网络编程(附赠练手小项目)
在公司花了两天的时间来研究Socket编程,感觉也还是学到了一点点皮毛,不过也还是有一点点的小成就. 配合Winform窗体界面,实现了简单的窗体间互相通信的小项目(可以互相发消息,服务器可以给客户端 ...
- 爬虫练手小项目:豆瓣高分图书TOP100
爬虫练手小项目:豆瓣高分图书TOP100 import requests import re from requests.exceptions import RequestException impo ...
- Golang练手小项目系列
Golang练手小项目系列 本系列整理了10个工作量和难度适中的Golang小项目,适合已经掌握Go语法的工程师进一步熟练语法和常用库的用法. golang练手小项目系列(1)-位向量 golang练 ...
- go语言面向对象 练手小项目
学习一门语言,最重要的就是动手,一个项目的代码写三遍,看起来笨的方法,实际上也是最快的方法. go语言的第一个练手小项目: 家庭收支记录软件的编写: 1.项目需求说明 模拟现实基于文本界面的<家 ...
- ssm练手小项目_20 个 JavaScript+Html+CSS 练手的小项目
前言: 最近在 GitHub 上发现了一个 vanillawebprojects[1] 开源仓库,里面收集了 20 个 JavaScript+Html+CSS的练手项目,没有使用任何框架,可以让你从基 ...
- 台式小风扇(HTML+CSS+JS练手小项目)
台式小风扇(HTML+CSS+JS练手小项目) 功能介绍 外观展示 HTML代码 CSS代码 JS代码 总结 功能介绍 前段时间看到这样的风扇特效,感觉还挺好玩,就自己也写一个练练手. 风扇有四个档位 ...
- 数据结构练手小项目(AVL树、哈希表、循环链表、MySQL数据库)
文章目录 前言 正文(无删减) 我的想法(删减修改版) 数据导入与数据存储 功能实现 数据结构 用户结构 SIM卡结构 AVL树数据结构 哈希表结构 数据表 用户表 SIM卡表 时间安排 前言 本月主 ...
- html+css+js之20个练手小项目(一)
html+css+js之20个练手小项目(一)--Hangman 前言 一.HTML 二.CSS 三.JS 前言 前端新手练习,记录不迷失. 主要练习html和CSS布局以及JS. 来源github, ...
- 练手小项目,爬取3DM图片
博客原文:https://weweweha.com 1. 概述 爬取3DM指定网页的游戏壁纸,并且通过多线程来加速爬取图片的速度. 2.使用库 request库用来1解析指定网页,re库用来搜 ...
- c语言模拟器怎么打程序,C语言初学者练手小项目——万花模拟器
原标题:C语言初学者练手小项目--万花模拟器 还记得小时候玩的万花尺么?好好玩,各种不同的点距能画出各种各样形状图形. C语言程序万花尺模拟 函数功能:每隔5秒随机生成万花图形 并自动保存作图参数以及 ...
最新文章
- 怎样导出或导入Cookie
- jtag引脚定义_硬件学习之通过树莓派操控 jtag
- QML中定义JavaScript资源
- 直播马上开始|不要怂,一起上!关于黑客攻防,我们有话要说
- 《孙子兵法》【作战第二】
- CoreAnimation编程指南(九)图层布局
- qt 5编程入门(第2版)_《C++并发编程实战第2版》第六章:设计基于锁的并发数据结构(1/3)...
- GRUB中硬盘和分区编号,UUID
- 特斯拉将国产Model 3和Model Y后轮驱动版价格上调4752元
- 联想微型计算机beta2,联想上网本升级IdeaPad S10-2
- SPSS配对样本t检验
- 计算机领域 专利挖掘,浅谈如何进行软件专利的挖掘
- 北信源与天津麒麟签战略合作协议 共建国产信息安全生态圈
- 为什么有些公司不招大龄程序员?
- db2 matlab实现,MATLAB MIMO-OFDM无线通信技术及 实现一书的源码和配套英文书267万源代码下载- www.pudn.com...
- 加快onenote同步速度
- Problem_1 小鸡啄米
- 开涛的博客 spring
- 阿里云盘下载与公测预约(最新)
- 计算机绘制表格教案,《表格的制作》教学设计
热门文章
- 输入是一个只包含拼音的字符串,请输出对应的数字序列。
- php汉字转换拼音插件,汉字转换拼音的PHP库
- pb模型文件与.pbtxt配置不匹配导致OpenCV调用dnn模块出错(Mask R-CNN为例)
- 沙盘模拟软件_我院学生参加第十六届全国大学生“新道杯”沙盘模拟经营大赛喜获佳绩...
- access根据所属院系修改学号_2016年计算机二级《Access》冲刺试题及答案
- Java程序---学生管理系统的登录和注册
- 基于SpringBoot在线电影订票系统
- JavaScript 中URL编码方式
- Java蓝桥杯——Fibonacci数列
- ubuntu查看显卡驱动以及其他驱动