嵌入式培训经验分享——网络编程项目实战(在线电子词典)

2023-05-16

在线电子词典采用服务器+客户端模式,运用TCP协议通信,,服务器端直接连接数据库。

1、服务器实现
功能
注册设计:如果用户没有注册,必须注册才能提供服务―包括修改用户名密码
(1)判断用户名有没有注册,如果有就拒绝,给个提示.
(2)用户注册:保存到数据库中注册表中
(3)断开连接,给出提示,注册成功请登录/可以保持长链接登陆设计:使用用户名密码登陆,
(4)登录时查询数据库中注册表根据用户名和密码,如果没有给个提示,要求进行注册,
        如果有,那就保持连接,后续使用该链接为用户提供查询服务.
(5)退出,客户端发送断开请求,关闭客户端的进程号
(6)词典查询,登陆的客户发送查询词典-单词,服务器返回翻译结果
(7)历史查询记录,登陆的用户,每次用户查询都记录到历史表里面
(8)修改密码        1.登陆的用户才能操作

                                2.执行数据库中注册表更新密码;

                                3.修改密码之后要求用户重登陆.
2、数据库的设计
(1)注册表,用于记录用户注册的用户名和密码,在登录时进行比对
(2)历史记录表记录所有用户的查询记录,用户名日期查询单词
3、客户端
功能:
(1)配合服务器,向用户提供服务,向服务器发送请求
(2)printf scanf 提示用户如何操作和美化操作的界面
(3)自主定义协议和代码框架,服务器和客户端采用的协议必须一致

客户端:

#include <stdio.h>	 
#include <sys/types.h>          
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include "commen.h"
#include <arpa/inet.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <errno.h>

int num=0;
char pre_name[16];

void set_init(char board[20][100],int a)
{
	//初始化界面
	for(int x=0;x<a;x++)
	{	
		printf("%s",board[x]);
		printf("\n");
	}
	printf("请输入你要执行的选项:");
}
//查询单词
int do_client_search_word(int socket)
{
	struct dic_msg msg;
	memset(&msg,0,sizeof(msg));
	//输入你要查找的单词
	printf("please input your search word:");
	scanf("%s",msg.word);
	strcpy(msg.name,pre_name);
	msg.cmd=4;
	int ret = send(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client send err");
		return -3;
	}
	
	memset(&msg,0,sizeof(msg));
	ret = recv(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client recv err");
		return -3;
	}
	
	if(msg.ret ==0)
	{
		//查询成功
		printf("%s\n",msg.response);
		printf("%s\n",msg.word_buf);
	}
	else 
	{
		//查询失败
		printf("%s\n",msg.response);
	}
	return -34;
	
}

//注销用户
int do_client_delete_user(int socket)
{
	struct dic_msg msg;
	memset(&msg,0,sizeof(msg));
	//输入你的用户名和密码
	printf("please input your name:");
	scanf("%s",msg.name);
	printf("please input your password:");
	scanf("%s",msg.passwd);
	
	msg.cmd=3;
	int ret = send(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client send err");
		return -3;
	}
	
	memset(&msg,0,sizeof(msg));
	ret = recv(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client recv err");
		return -3;
	}
	
	if(msg.ret ==0)
	{
		//注销成功
		printf("%s\n",msg.response);
	}
	else 
	{
		//注销失败
		printf("%s\n",msg.response);
	}
	return -34;
}

//修改密码
int do_client_rev_passwd(int socket)
{
	struct dic_msg msg;
	memset(&msg,0,sizeof(msg));
	//输入你的用户名和密码
	printf("please input your name:");
	scanf("%s",msg.name);
	printf("please input your password:");
	scanf("%s",msg.passwd);
	printf("please input your new password:");
	scanf("%s",msg.new_passwd);
	
	msg.cmd=6;
	int ret = send(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client send err");
		return -3;
	}
	
	memset(&msg,0,sizeof(msg));
	ret = recv(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client recv err");
		return -3;
	}
	
	if(msg.ret ==0)
	{
		//修改密码成功
		printf("%s\n",msg.response);
	}
	else 
	{
		//修改密码失败
		printf("%s\n",msg.response);
	}
	return -34;
}

//查询历史
int do_client_history(int socket)
{
	struct dic_msg msg;
	struct history_serv_msg his_msg;
	memset(&his_msg,0,sizeof(his_msg));
	memset(&msg,0,sizeof(msg));
	
	msg.cmd=5;
	int ret = send(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client send err");
		return -3;
	}
	
	memset(&msg,0,sizeof(msg));
	ret = recv(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client recv err");
		return -3;
	}
	
	ret = recv(socket,&his_msg,sizeof(his_msg),0);
	if(ret < 0)
	{
		perror("client recv err");
		return -3;
	}
	
	if(msg.ret ==0)
	{
		//查询历史成功
		printf("%s\n",msg.response);
		for(int i=0;i<(his_msg.nrow+1)*(his_msg.ncolum);i++)
		{
			printf("%-16s",his_msg.buf[i]);
			if((i+1) % his_msg.ncolum == 0 )
			{
					printf("\n");
			}
		}
	}
	else 
	{
		//查询历史失败
		printf("%s\n",msg.response);
		for(int i=0;i<(his_msg.nrow+1)*(his_msg.ncolum);i++)
		{
			printf("%-16s",his_msg.buf[i]);
			if((i+1) % his_msg.ncolum == 0 )
			{
					printf("\n");
			}
		}
	}
	return -34;
	
	return 0;
}


//查询操作
int do_search_dic(int socket)
{
	char xbuf[10];
	while(1)
	{
		int a;
		//初始化词典界面
		set_init(board_reg_success,11);
		scanf("%d",&a);
			 
		switch(a)
		{
			case 1: //查询单词
				do_client_search_word(socket);									
				break;
			case 2: //查询历史
				do_client_history(socket);
				break;
			case 3: //注销
				do_client_delete_user(socket);
				break;
			case 4:	//修改密码
				do_client_rev_passwd(socket);
				break;
			case 5: //退出
				return 0;
			default:
				printf("输入格式有误\n");
				fgets(xbuf,sizeof(xbuf),stdin);
				break;				
		}
	}
	return 0;
}

//登录操作
int do_loged(int socket)
{
	struct dic_msg msg;
	memset(&msg,0,sizeof(msg));
	//输入你的用户名和密码
	printf("please input your name:");
	scanf("%s",msg.name);
	strcpy(pre_name,msg.name);
	printf("please input your password:");
	scanf("%s",msg.passwd);
	
	msg.cmd=1;
	int ret = send(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client send err");
		return -3;
	}
	
	memset(&msg,0,sizeof(msg));
	ret = recv(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client recv err");
		return -3;
	}
	
	if(msg.ret ==0)
	{
		//登录成功
		printf("%s\n",msg.response);
		do_search_dic(socket);
	}
	else 
	{
		//登录失败
		printf("%s\n",msg.response);
	}
	return -34;
}

//注册操作
int do_register(int socket)
{
	struct dic_msg msg;
loop:	
	memset(&msg,0,sizeof(msg));
	//设置你的用户名和密码
	printf("please set your name:");
	scanf("%s",msg.name);
	printf("please set your password:");
	scanf("%s",msg.passwd);
	
	msg.cmd=2;
	int ret = send(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client send err");
		return -3;
	}
	
	memset(&msg,0,sizeof(msg));
	ret = recv(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client recv err");
		return -3;
	}
	
	if(msg.ret ==0)
	{
		//注册成功
		printf("%s\n",msg.response);
	}
	else 
	{
		//注册失败
		printf("%s\n",msg.response);
		goto loop;
	}
}


int main(int argc,char **argv)
{	
	//创建套接字
	int socket_clie = socket(AF_INET,SOCK_STREAM,0);
	if(socket_clie < 0)
	{
		perror("socket creat err");
		return -1;
	}
	printf("socket success\n");
	//与服务器建立联系
	struct sockaddr_in serv_addr;
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_port = htons(10060);
	serv_addr.sin_addr.s_addr = INADDR_ANY;//inet_addr("192.168.3.76");
	//int ret = connect(socket_clie,(struct sockaddr *)&serv_addr,sizeof(serv_addr));
	if(ret < 0)
	{
		perror("connect err");
		return -3;
	}
	printf("connect success\n");
	
	while(1)
	{	
		int a;
		//初始化词典界面
		set_init(board_reg,10);
		scanf("%d",&a);
			 
		switch(a)
		{
			case 1: //登录
				do_loged(socket_clie);									
				break;
			case 2: //注册
				do_register(socket_clie);
				break;
			case 3: //退出
				break;
			default:
				printf("输入格式有误\n");
				break;				
		}
	}
	
	return 0;
}

需要更加详细的,可以看我的主页。(12条消息) 嵌入式培训经验分享——网络编程项目实战(在线电子词典)-网络基础文档类资源-CSDN文库

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式培训经验分享——网络编程项目实战(在线电子词典) 的相关文章

  • go微服务框架Kratos简单使用总结

    Kratos是B站开源的一款go的微服务框架 xff0c 最近PS5上的 战神 诸神黄昏比较火 xff0c 主角就是奎托斯 这个框架的名字就取自他 在进行框架选型时 xff0c 对比了目前主流的很多go微服务框架 xff0c 如Zero x
  • Gradle重新安装后下载插件失败 Read timed out 问题解决

    究极大坑记录 在使用gradle进行构建kotlin项目时 xff0c 项目所用依赖版本需要同步升级gradle版本 升级gradle版本后 xff0c gradle相关插件无法下载 xff0c 反复timeout超时 症状如下 xff1a
  • Jenkins启动失败:Failed to start LSB: Jenkins Automation Server.

    启动systemctl start jenkins service提示 Job span class token keyword for span jenkins service failed because the control pro
  • 最新版 Let’s Encrypt免费证书申请步骤,保姆级教程

    最近将域名迁到了google domain xff0c 就研究了一下Let s Encrypt的域名证书配置 发现网上找到的教程在官方说明中已经废弃 xff0c 所以自己写一个流程记录一下 步骤方法官方文档见 xff1a https eff
  • git 加速代理设置,单仓库设置代理,指定仓库设置单独代理

    1 git全局设置代理 git config global https proxy http 127 0 0 1 7890 git config global https proxy https 127 0 0 1 7890 取消的命令 x
  • 软件系统设计细节,你不知道的13个实践经验!

    记录道具来源等的 source 字段时 xff0c 可以使用 xff08 类名 43 方法名 xff09 xff08 包名 43 方法名 xff09 的组合 xff0c 可以清晰地区分来源 并且可以灵活地增加新的渠道 动作 涉及金额 钱的字
  • 从typro到Obsidian

    使用了typro 3年有餘 xff0c 最近看到yukang的年終博客 xff0c 又一次提到了Obsidian這個軟件 很久沒有還編輯工具的我 xff0c 想要折騰一下 於是 馬上開始 xff01 第一步 xff0c 啥也不知道 xff0
  • C++线程

    1 创建线程 span class token macro property span class token directive hash span span class token directive keyword include s
  • OpenGPT的11种高效用法

    1 问答提示 2 解释复杂的概念 3 创作 创作需要尽可能的缩小范围 xff0c 提出具体的要求 xff0c AI会给出更好的答案 4 准备面试 5 教师教案 6 编码和集成 7 健身 8 送礼推荐 9 翻译 这个甚至不用去演示 xff0c
  • 浅析鹅鸭杀中服务端的技术实现和要点

    在朋友的介绍下 xff0c 我下载了这款游戏 由于之前玩过 Among Us xff0c 我本以为这款游戏不会达到正宗的太空狼人杀的水平 xff08 毕竟是免费的 xff09 但实际游玩后 xff0c 我被它更加丰富的设定和玩法所吸引 接下
  • nginx代理静态网站css解析异常

    今天在使用ecs进行部署网页时 xff0c 出现了一个问题 使用nginx代理到页面index html路径下 xff0c 同路径的资源都可以加载到 xff0c 但是却无法正确加载到页面样式 打开f12 xff0c 网络和控制台都没有资源异
  • 为什么mysql的delete操作不释放磁盘空间

    在 InnoDB 中 xff0c delete 操作并不会真的删除数据 xff0c mysql 实际上只是给要删除的数据打了标记 xff0c 标记为删除 磁盘所占空间不会变小 xff0c 即表空间并没有真正被释放 一 MySQL 删除数据几
  • docker start :FAIL Hypervisor framework fails

    mac 上启动 Docker 提示 FAIL Hypervisor framework fails 提示环境变量出错 我这台 mac 是自己攒的生产力 xff0c 由于软件是直接从旧的 mac 上迁移过来的 xff0c 我怀疑可能是系统版本
  • 在google设置静态页面 CDN加速

    一 创建bucket xff0c 设置bucket 链接 xff1a https console cloud google com storage browser 创建bucket 设置bucket公开访问 在bucket列表中 xff0c
  • Google Cloud Storage CORS跨域允许,忽略访问控制来源标头

    google storage origin https xxx com has been blocked by CORS policy No Access Control Allow Origin header is present on
  • 聊天记录存储实践

    公司的某款游戏在1月初接入微软小冰AI聊天功能 为了保存聊天记录并为后续的统计功能做好准备 xff0c 决定将聊天记录存放在服务端 最初并不清楚聊天数据量的大小以及玩家对聊天功能的使用情况 xff0c 所以采用了价格和性能相对宽容的MySQ
  • 将本地服务通过ssh代理给外部访问(如何使用 ssh 将本地服务代理给外部访问并保持 SSH 会话的连接性)

    如何使用 ssh 将本地服务代理给外部访问并保持 SSH 会话的连接性 1 外部服务器 nginx 配置 server span class token punctuation span listen localhost 80 span c
  • Go 单元测试高效实践

    敏捷开发中有一个广为人知的开发方法就是 XP xff08 极限编程 xff09 xff0c XP 提倡测试先行 xff0c 为了将以后出现 bug 的几率降到最低 xff0c 这一点与近些年流行的 TDD xff08 测试驱动开发 xff0
  • 操作系统—分段与分页

    1 地址重定位 所谓的地址重定位 xff08 也叫地址翻译 xff09 就是修改程序中的内存地址 xff0c 使得程序被载入内存后 xff0c 那些地址能够指向正确的内存空间 例如 xff0c 程序中包含 call 40 语句 xff0c
  • putty连接被拒的原因分析

    1 xff1a 检查防火墙 2 xff1a PING虚拟机 3 xff1a SSHD etc init d sshd start开启服务 4 xff1a IP字段问题 ifconfig eth0 新IP xff08 更改为字段和主机一样的I

随机推荐

  • Charles+Postern抓包遇到的问题(已解决)

    问题描述 Charles的代理配置和Postern的代理配置的都是正确的 xff0c 但是当在手机上打开Postern中的开启VPN时 xff0c Charles上没有任何反应 解决方法 xff1a 我在多次配置实验无果的情况下 xff08
  • 4. ROS编程入门--PID控制器

    介绍 xff1a 这篇教程是交给大家怎么在ROS里写一个PID控制器 xff0c PID控制器有三部分 比例部分 xff08 P xff09 积分部分 xff08 I xff09 微分部分 xff08 D xff09 PID的输出是这三部分
  • 6. ROS编程入门--路径跟随(Trajectory following)

    Task 本次实验才采用 Follow the carrot 算法去跟随定义好的路径 控制的目标点在机器人行走的路径上 xff0c 距离机器人是个常数距离 机器人计算自己的方向角和目标点角度之间的相差度数 控制这个差角为0 为了在探测时候能
  • 位姿矩阵求逆

    位姿矩阵求逆 位姿矩阵分析位姿矩阵求逆矩阵 为了更好的说明问题 xff0c 我们先来看一下位姿矩阵的定义 位姿矩阵分析 如下图所示 xff1a 如果在B坐标系下有一点PB xff0c 我们需要知道该点在坐标系A下的坐标PA xff0c 怎么
  • UNIX环境高级编程

    环境配置 1 下载apue 3e文件夹 xff0c 可以通过http www apuebook com code3e html现在源码 2 解压后执行进入apue 3e中执行make指令 如果出现 96 96 96 collect2 err
  • C#连接SQL Server 数据库

    C 是如何跟SQL Server进行连接的 xff1f 在C NET程序设计中 xff0c 离不开ADO NET ADO NET是 NET连接数据库的重要组件 使用其可以很方便地访问数据库 xff0c ADO NET还可以访问Oracle数
  • 冒烟测试和回归测试的区别

    每次新的版本出来的时候 xff0c 老大就让我们 冒烟 虽然不知道冒烟测试的含义 xff0c 但由于没有给用例 xff0c 我就随便跑跑 跑完冒烟后 xff0c 老大就让做 回归测试 xff0c 把bug回归掉 但是其实对2个概念还是不太理
  • Webpack——02——打包html资源

    1 在src中创建webpack的入口文件index js xff0c index html 2 src的同级目录下创建webpack config js 3 下载插件html webpack plugin 老规矩 初始化 xff0c 下w
  • AT&T 汇编

    1 基础 x86 的寄存器为32位 xff0c x64 的寄存器为64位 寄存器间对应关系 xff1a 64位寄存器 低32位 低16位 低8位 rax eax ax al rbx ebx bx bl rcx ecx cx cl rdx e
  • 向导对话框[转]

    很久以前在网上看到的一片文章 xff0c 忘了是谁写的了 xff0c 觉得很好 xff0c 所以在这里转载 首先要了解的是CPropertySheet实际上是由一个TabCtrl加多个Page和多个按钮组成 这里强调一点 xff0c DoM
  • win10用pip安装face_recognize

    1 安装CMake 命令 xff1a pip install CMake 2 安装face recognition xff08 也可先安装dlib xff09 命令 xff1a pip install face recognition 查看
  • VS2019配置SFML

    VS2019配置SFML 1 下载安装SFML SDK 网址 xff1a https www sfml dev org download php 解压并放在文件夹里 xff0c 记住这个路径 在我的电脑中这个路径是F C 43 43 Pro
  • django学习笔记

    未更新完成 文章目录 一 什么是django1 1 有关django1 1 1 开始1 1 2 MVC框架 设计模式1 1 3 Django架构 MTV模型 1 2 安装配置开始django1 2 1 python和django1 2 2
  • 战略性放弃日记

    文章目录 20216 26 2021 6 26 在win10中部署linux子系统ubuntu时 xff0c 安装WSL图形界面遇到报错 ccsm命令后 xff0c 报错 NoneType object has no attribute g
  • docker安装linux-ubuntu桌面环境

    操作系统 xff1a win10 docker版本 xff1a 20 10 7 xff08 可通过docker version确认 xff09 在cmd或window power shell中输入命令 1 拉取镜像 docker pull
  • Cent OS7下载和安装图形桌面教程

    具体安装教程 下载地址 xff1a https www centos org download 1 进入官网 xff0c 找到下载 xff0c 下面三个ios镜像都可以选择 2 使用链接下载cent os ios centos7安装GUI图
  • Udacity 深度学习项目2(Project2) Image Classification 解析

    本项目需要搭建一个简单的卷积神经网络 xff08 CNN xff09 来对 CIFAR 10 数据进行图片分类 本文记录了这个项目的一些注意事项 xff11 数据的预处理 xff1a 对于CIFAR 10 的图片数据 xff0c 首先要做归
  • 网络程序设计——VC的多线程编程(线程与进程)

    目录 一 线程与进程 1 线程 2 引用线程的原因 3 线程与进程的关系 4 线程的特点 二 线程函数的参数传递 三 多线程与单线程的区别 四 线程创建函数 beginthread 和 beginthreadex 五 终止线程函数 一 线程
  • linux apt-get autoremove千万别乱用

    使用linux下的apt get autoremove命令的心得体会 前几天在实验室搭建要做人工智能项目的环境时 xff0c 由于未解决python2 7和python3 6共存时 xff0c 只利用python2 7版本的库文件 xff0
  • 嵌入式培训经验分享——网络编程项目实战(在线电子词典)

    在线电子词典采用服务器 43 客户端模式 xff0c 运用TCP协议通信 xff0c xff0c 服务器端直接连接数据库 1 服务器实现 功能 注册设计 如果用户没有注册 必须注册才能提供服务 包括修改用户名密码 xff08 1 xff09