寒假项目-酒店综合管理系统

news2024/11/28 1:41:36

       目前所学的东西依然很有限,难以完成项目,目前只编写了部分代码加以参考。

test.c

#ifndef __TEST_H__
#define SER_PORT 8888                  //服务器端口号
#define SER_IP  "192.168.?.?"      //服务器IP地址
#endif 

//定义一个用于向线程体函数传参的结构体类型
struct MsgInfo
{
    int newfd;
    struct sockaddr_in cin;
};

//定义线程处理函数
void *deal_cli_msg(void *arg)
{

    //解析传进来的参数
    int newfd = ((struct MsgInfo*)arg)->newfd;
    struct sockaddr_in cin = ((struct MsgInfo*)arg)->cin;

    //5、跟客户端进行消息通信
    char buf[128] = "";
    while(1)
    {
        //将数组清空
        bzero(buf, sizeof(buf));

        //读取客户端发来的消息
        //int res = read(newfd, buf, sizeof(buf));
        int res = recv(newfd, buf, sizeof(buf), 0);
        if(res == 0)
        {
            printf("客户端已经下线\n");
            break;
        }
        printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);

        //给客户端发消息
        strcat(buf, "*_*");

        //write(newfd, buf, sizeof(buf));
        send(newfd, buf, sizeof(buf), 0);
        printf("发送成功\n");
    }

    //关闭当前通信的套接字
    close(newfd);

    //退出线程
    pthread_exit(NULL);
}

//注册操作
int do_register()
{
    //追加读写操作,注册内容追加写入
    char access[20];
    char password[20];

	//创建或打开数据库
	sqlite3 *ppDb = NULL;
	if(sqlite3_open("./MYSQL.db", &ppDb) != SQLITE_OK)
    {
        printf("sqlite3_open error,errcode = %d, errmsg = %s\n", sqlite3_errcode(ppDb), sqlite3_errmsg(ppDb));
        return -1;
    }
    printf("sqlite3_open success\n");

    //通过fgets获取终端输入字符串,存入access和password中
    printf("输入账号:");
    fgets(access,sizeof(access),stdin);
    printf("输入密码:");
    fgets(password,sizeof(password),stdin);
    //将字符数组变为字符串
    access[strlen(access)-1]='\0';
    password[strlen(password)-1]='\0';

    char sql[128] = "";
    sprintf(sql, "insert into Users values(%s,%s);",access,password);
    printf("sql = %s\n", sql);
	//向数据库写入数据
	char* errmsg = NULL;
    if(sqlite3_exec(ppDb,sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("sqlite3_exec error: %s\n", errmsg);
        //释放errmsg的空间
        sqlite3_free(errmsg);
        errmsg = NULL;
        return -1;
    }
	
	
	puts("注册成功");
	//关闭数据库
	sqlite3_close(ppDb);

    return 0;
}

int callback(void *arg, int cols, char**value_text, char **value_name)
{


    if((*(int *)arg) == 0)
    {
        //输出表头
        for(int i=0; i<cols; i++)
        {
            printf("%-10s", value_name[i]);
        }
        printf("\n");
        *((int *)arg)  = 1;       //更改标识位
    }

    //输出当前记录的信息
    for(int i=0; i<cols; i++)
    {
        printf("%-10s", value_text[i]);
    }
    printf("\n");

    return 0;
}

//登录操作
int do_login()
{
    char access[20];
    char password[20];
    //存入终端输入的账号密码
    printf("输入账号:");
    fgets(access,sizeof(access),stdin);
    printf("输入密码:");
    fgets(password,sizeof(password),stdin);

    access[strlen(access)-1]='\0';
    password[strlen(password)-1]='\0';

	//创建或打开数据库
	sqlite3 *ppDb = NULL;
	if(sqlite3_open("./MYSQL.db", &ppDb) != SQLITE_OK)
    {
        printf("sqlite3_open error,errcode = %d, errmsg = %s\n", sqlite3_errcode(ppDb), sqlite3_errmsg(ppDb));
        return -1;
    }
    printf("sqlite3_open success\n");
    	
		// 查看数剧库是否有这个名字存在
		char sql_access[128]="select count(*) from Users where username=access";
		char sql_password[128]="select count(*) from Users where userpass=password";
		int count1 = 0,count2 = 0;

		char* errmsg1 = NULL;   
		char* errmsg2 = NULL;   
		sqlite3_exec(ppDb, sql_access, callback,&count1, &errmsg1);
		sqlite3_exec(ppDb, sql_password, callback,&count1, &errmsg2);
		if(count1 != 0&& count2!=0)
		{
            puts("登录成功");
        }

	//关闭数据库
	sqlite3_close(ppDb);
    return 0;

}

main.c


#define SER_PORT 8888                  //服务器端口号
#define SER_IP  "192.168.?.?"      //服务器IP地址

int main(int argc, const char *argv[])
{
	//创建或打开数据库
	sqlite3 *ppDb = NULL;
	if(sqlite3_open("./MYSQL.db", &ppDb) != SQLITE_OK)
    {
        printf("sqlite3_open error,errcode = %d, errmsg = %s\n", sqlite3_errcode(ppDb), sqlite3_errmsg(ppDb));
        return -1;
    }
    printf("sqlite3_open success\n");
	//创建表格,表名Users
	char sql[128]="create table Users(username char,userpass char)";
	char* errmsg = NULL;
	sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg);
  	
	//关闭数据库
	sqlite3_close(ppDb);
	//登陆
    char num;
    //循环打印选项
    while(1)
    {
        printf("-----1.注册-----\n");
        printf("-----2.登录-----\n");
        printf("-----0.退出-----\n");
        printf("请输入选项:");
        scanf("%c",&num);
        //通过循环吃掉从第二个字符开始的所有垃圾字符
        while(getchar()!='\n');
        switch(num)
        {
            case '1':
                do_register();
                break;
            case '2':
                do_login();
                break;
            case '0':
                exit(EXIT_SUCCESS);
                break;
            default:
                puts("error");
        }
        printf("按回车清屏");
        //吃掉回车前所有垃圾字符
        while(getchar()!='\n');
        system("clear");
    }

    //1、创建用于连接的套接字
    int sfd = socket(AF_INET, SOCK_STREAM, 0);  
    if(sfd == -1)
    {
        perror("socket error");
        return -1;
    }
    printf("sfd = %d\n", sfd);               
    
	//对套接字设置接收超时时间
    struct timeval tv;
    tv.tv_sec = 10;         //10秒
    tv.tv_usec = 0;      
    
	
	//将端口号快速重用函数
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &tv, sizeof(reuse)) == -1)
    {
        perror("setsockopt error");
        return -1;
    }
    printf("端口号快速重用成功\n");

    //2、给当前套接字绑定IP地址和端口号
    //2.1填充要绑定的地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family =     AF_INET;        //通信域
    sin.sin_port =         htons(SER_PORT);  //端口号
    sin.sin_addr.s_addr =     inet_addr(SER_IP);    //ip地址

    //2.2 绑定
    if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1)
    {
        perror("bind error");
        return -1;
    }
    printf("bind success %s %s %d\n", __FILE__, __func__, __LINE__);

    //3、将套接字设置成监听状态
    if(listen(sfd, 128) == -1)
    {
        perror("listen error");
        return -1;
    }
    printf("listen success %s %s %d\n", __FILE__, __func__, __LINE__);

    //4、阻塞等待客户端的链接请求
    //4.1定义容器接收客户端的地址信息
    struct sockaddr_in cin;                  //用于接收地址信息
    socklen_t socklen = sizeof(cin);          //用于接收地址信息的大小

    int newfd = -1;

    pthread_t tid;              //线程id号

    while(1)
    {
        //将程序执行到accept处时,系统会给accept函数预选一个文件描述符,按最小未分配原则
        //4.2 接收客户端的链接
        newfd = accept(sfd, (struct sockaddr*)&cin, &socklen);   
        if(newfd == -1)
        {
            perror("accept error");
            return -1;
        }
        printf("[%s:%d:%d]发来链接请求 %s %s %d\n", \
                inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd, __FILE__, __func__, __LINE__);

        //定义用于传参的结构体变量
        struct MsgInfo info;
        info.newfd = newfd;
        info.cin = cin;

        //创建分支线程,用于跟新连接的客户端进行交互
        if(pthread_create(&tid, NULL, deal_cli_msg, &info) != 0)
        {
            printf("分支线程创建失败\n");
            return -1;
        }

        //回收线程资源
        pthread_detach(tid);             //将线程分离,后期退出后,由系统回收资源

    }

    //6、关闭套接字
    close(sfd);
    return 0;
}

        以上是本次项目是服务器端的代码,由于遇到了一堆问题,无法得出运行结果,gcc编译阶段都过不了,主要过程是创建数据库,创建表格,表格存储登陆数据,提供登陆/注册选项等,之后创建套接字,端口重用,绑定IP等,使用多线程接收客户端的连接。但是遇到了很多问题。

遇到的问题:

1.采用数据库实现信息存储时,不知道如何查看表中是否存在某种信息,例如希望实现查看用于记录注册的信息,登陆时,想判断表中是否存在该用户名和密码时,不知道怎么判断,网上搜索结果使用的select count(*)......的代码,但是使用时出现了报错信息,并且返回值不知道怎么获取,如果使用

sqlite3_exec(ppDb, sql_password, callback,&count1, &errmsg1);

显然是错误的,目前不知道如何改进。

2.题目中所说的使用Sock编程,所有客户端发送数据采用协议的形式,协议包含两部分:包头+数据,给出了包头等信息,但是我完全没有思路,不知道该怎么搞,客户端发送数据的话直接发送信息就能达到客户端与服务器的通信,进行封装,然后区分数据类型进行不同的操作,这一点不知道如何实现。

3.题目中需要实现多个终端,手持终端发送信息给服务器端,但是不知道如何实现服务器端将接受的信息区分开,选出所点的菜单,然后菜单又是如何不发送给吧台/手持终端的客户端,只发送给多个厨房的客户端?对于这些几乎完全没有思路。

4.正常情况下,服务器的IP地址应该是192.168.?.?,但是连上家里这边的网络之后,使用ifconfig指令得到的结果却是这样的

似乎无法得到正确的IP地址,不知道是什么原因。

5、厨房客户端,设置每桌订单的状态,分三个状态,初始状态为等待,其次正在准备中,第三个已经完成,实现这个的话,思路大致是,向服务器端发送桌号,然后每隔一段时间向服务器发送等待的状态,那么这个状态怎么到准备中的状态?又怎么到已完成的状态?

总结:这次项目对我目前的水平来说太难了,不管是哪一个部分都难以完全实现,日后结果学习希望能有更好的思路。

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

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

相关文章

【stm32】hal库学习笔记-DAC数模转换(超详细!)

【stm32】hal库学习笔记-DAC数模转换&#xff08;超详细&#xff01;&#xff09; DAC功能概述 DAC&#xff1a;将数字信号转换为模拟信号 并行式 分辨率 采样速率 DAC驱动函数 Cube图形化配置 导入TFT_LCD ioc 设置DAC通道 更改ADC配置 优先级设置 更改TIM3配置 按键…

VScode中配置 C/C++ 环境 | IT拯救者

文章目录 0 引言1. 下载编辑器VScode2. 下载编译器MinGW并解压3. 将MinGW添加至环境变量4. 配置VScode插件5. 运行代码6. 调整和优化7. 提示8. 例行格式条款9. 例行格式条款 0 引言 由于VScode毛毛张使用不习惯&#xff0c;因此配置教程记不住&#xff0c;不过毛毛张看到一篇不…

【惠友小课堂】滑雪的尽头是骨科?这份滑雪指南快收好,安全快乐两不误

今年滑雪运动异常火爆&#xff0c;寒假一开启&#xff0c;不少家长趁着放假打算带孩子出门玩一趟&#xff0c;各地的滑雪场也成了最热门的旅游项目之一。 但说到滑雪 不少网友调侃“听说雪道的尽头是骨科”还有人说“今年滑雪一共花了2万”“滑雪2000&#xff0c;骨折进医院180…

免费chatgpt使用

基本功能如下&#xff1a; https://go.aigcplus.cc/auth/register?inviteCode3HCULH2UD

[OPEN SQL] 更新数据

UPDATE语句用于更新数据库表中的数据 本次操作使用的数据库表为SCUSTOM&#xff0c;其字段内容如下所示 航班用户(SCUSTOM) 需要操作更新以下数据 1.更新单条数据 语法格式 UPDATE <dbtab> FROM <wa>. UPDATE <dbtab> FROM TABLE <itab>. UPDATE &l…

gorm day9(结)

gorm day9 实体关联gorm会话 实体关联 自动创建、更新 在创建、更新数据时&#xff0c;GORM会通过Upsert自动保存关联及其引用记录。 user : User{Name: "jinzhu",BillingAddress: Address{Address1: "Billing Address - Address 1"},Ship…

【AIGC】Stable Diffusion的ControlNet插件

ControlNet 介绍 ControlNet 插件是 Stable Diffusion 中的一个重要组件&#xff0c;用于提供对模型的控制和调整。以下是 ControlNet 插件的主要特点和功能&#xff1a; 模型控制&#xff1a; ControlNet 允许用户对 Stable Diffusion 中的模型进行精细的控制和调整。用户可以…

【OpenAI Sora】开启未来:视频生成模型作为终极世界模拟器的突破之旅

这份技术报告主要关注两个方面&#xff1a;&#xff08;1&#xff09;我们的方法将各种类型的视觉数据转化为统一的表示形式&#xff0c;从而实现了大规模生成模型的训练&#xff1b;&#xff08;2&#xff09;对Sora的能力和局限性进行了定性评估。报告中不包含模型和实现细节…

【研究生复试】计算机软件工程人工智能研究生复试——资料整理(速记版)——计算机网络

1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机租场原理 6、软件工程 7、大数据 8、英文 自我介绍 2. 计算机网络 1. TCP如何解决丢包和乱序&#xff1f; 序列号&#xff1a;TCP所传送的每段数据都有标有序列号&#xff0c;避免乱序问题发送端确认应答、超时…

(16)Hive——企业调优经验

前言 本篇文章主要整理hive-3.1.2版本的企业调优经验&#xff0c;有误请指出~ 一、性能评估和优化 1.1 Explain查询计划 使用explain命令可以分析查询计划&#xff0c;查看计划中的资源消耗情况&#xff0c;定位潜在的性能问题&#xff0c;并进行相应的优化。 explain执行计划…

UI设计常见风格(1):一文读懂九个,教你如何辨识。

Hello&#xff0c;我是大千UI工场&#xff0c;设计风格是我们新开辟的栏目&#xff0c;上次讲了毛玻璃风格、辨识方法、应用场景、运用方法等&#xff0c;很受大家欢迎&#xff0c;本次带来常见的风格及辨识&#xff0c;让大家有个总览&#xff0c;以后会逐个讲解的&#xff0c…

<代码整洁之道>精彩片段整理

最近在读这本<代码整洁之道>&#xff0c;感觉里面有很多内容都很有启发。整理下来&#xff0c;大家一起看下&#xff0c;顺便看看作者说的有没有道理。这本书的作者是&#xff1a;罗伯特丶马丁&#xff0c;大家经常叫他鲍勃大叔。下面直接进入正题&#xff0c;先看一下目…

【开源】新生报到网站 JAVA+Vue.js+SpringBoot+MySQL

本文项目编号&#xff1a; T 002 。 \color{red}{本文项目编号&#xff1a;T002。} 本文项目编号&#xff1a;T002。 目录 1 功能模块1.1 在线交流模块1.2宿舍分配模块1.3 校园概况模块1.4 专业管理模块 2 系统展示3 核心代码3.1 图表展示3.2 查询评论3.3 新增报道 4 免责声明 …

【实战】一、Jest 前端自动化测试框架基础入门(一) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(一)

文章目录 一、前端要学的测试课1.前端要学的测试2.前端工程化的一部分3.前端自动化测试的例子4.前端为什么需要自动化测试&#xff1f;5.课程涵盖内容6.前置技能7.学习收获 二、Jest 前端自动化测试框架基础入门1. 自动化测试背景及原理前端自动化测试产生的背景及原理 2.前端自…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第四天-ARM Linux编程之IIC与uart (物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd1688 提取码&#xff1a;1688 教学内容&#xff1a; 1、I2C总线&#xff1a; I2C&#xff08;Inter&#xff0d;Integrated Circuit),PHILIPS公司开发的两线式半双工同步串行总线&#xff1b;可以用来连…

[职场] 汉语言文学求职信范文 #微信#笔记

汉语言文学求职信范文 在撰写求职信之前一定要明确自己写信的目的&#xff0c;然后&#xff0c;在撰写过程中&#xff0c;朝着这个目的前进。其次&#xff0c;撰写求职信的时候一定要包含自己的竞争优势&#xff0c;用相应的数据或者故事讲述&#xff0c;切记空谈阔论。最后&am…

LeetCode Python - 19.删除链表的倒数第N个结点

目录 题目答案运行结果 题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&a…

漫漫数学之旅022

文章目录 经典格言数学习题古今评注名人小传- 刘易斯卡罗尔 经典格言 艾丽斯笑着说&#xff1a;“去尝试也毫无用处&#xff0c;一个人无法相信不可能的事情。”——刘易斯卡罗尔&#xff08;Lewis Carroll&#xff09;《艾丽斯梦游仙境&#xff08;Alice in Wonderland&#…

[OPEN SQL] 新增数据

INSERT语句用于数据的新增操作 本次操作使用的数据库表为SCUSTOM&#xff0c;其字段内容如下所示 航班用户(SCUSTOM) 该数据库表中的部分值如下所示 1.插入单条数据 语法格式 INSERT <dbtab> FROM <wa>. INSERT INTO <dbtab> VALUES <wa>. INSERT &…

紫微斗数双星组合:廉贞天府在辰戌

文章目录 前言内容总结 前言 紫微斗数双星组合&#xff1a;廉贞天府在辰戌 内容 紫微斗数双星组合&#xff1a;廉贞天府在辰戌 性格分析 廉贞天府同坐辰、戌宫&#xff0c;若无煞星冲破&#xff0c;为“天府朝垣格”&#xff0c;也为“府相朝垣格”&#xff0c;富贵双全&am…