基于Linux系统下的在线手机商城
- 项目背景
随着网络的发展,电子商务的兴起和普及使得消费者越来越倾向于通过互联网购买商品和服务,越来越多的传统零售商和新兴企业转向在线销售以满足消费者的需求,个成功的在线商城项目背景包括对市场需求、竞争环境、技术和平台选择、商业模式和目标、以及用户体验和功能需求的全面理解和分析,越来越多的传统零售商和新兴企业转向在线销售以满足消费者的需求,所以有了在线商城项目。
- 项目功能
该服务端有四级页面,第一级为用户的用户名以及和密码的输入以及登录。第二级为用户模糊输入自己所需要商品的模糊名字后服务端将与其相关的商品罗列出来。第三级是服务器罗列出所有的相关商品,用户可以点击商品的到其具体信息。第四级是服务器输出的具体商品的信息。在每个界面用户都可以搜索。
- 项目框架
- 主要模块:main函数,数据库查询模块,四个html文件模块,多任务服务器创建模块。
- 用户访问网页:用户直接访问服务器ip
- 语言:hteml语言以及c语言
- 编码结构:makefile多文件编码
- 项目模块分析介绍
多任务服务器担架:用多进程搭建可供大批用户访问的服务器。
Html文件:构造网页画面以及美好网页
数据库查询模块:用户查询时调用查询数据库的函数将库中相关信息导出。
Main:执行函数。
购买模块:设计到交易,有大量风险,略。
商品概述:数据库信息的导出。
Log:将访问服务器的用户信息记录下来。
- 项目流程图及介绍
- 项目交互的函数口和数据类型
typedef struct http_req
{
char url[512];
char method[32];
char content[1024];
}HTTP_REQ_t;用于解析用户发出的请求
char good[50][1024]将遍历数据库得到的物品名存入good中。
int good_num 定义目标模糊查询的物品数量,访问html文件时需要使用
int recv_http_request(int connfd,char *http_buff,int maxnum)接受用户发送的需求,为main函数的主要函数之一。
int prase_http_request(char *http_buff, HTTP_REQ_t *req):解析用户的命令。
int send_http_response_head(int connfd);发送用户需要的数据
unsigned char FromHex(unsigned char x)
int urlDecode( char* dest, const char* src):解析用户查询汉字时的乱码。
Connfd通讯字贯穿整个项目。
main:
#include "../head.h"
#include "http.h"
#include "log.h"
int sock_Init(const char *ip,unsigned short port)
{int sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd == -1){perror("fial socket");return -1;}int val = 1;setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));struct sockaddr_in ser;ser.sin_family = AF_INET;ser.sin_port = htons(port);ser.sin_addr.s_addr = inet_addr(ip);int ret = bind(sockfd,(struct sockaddr *)&ser,sizeof(ser));if(ret == -1){perror("fail bind");return -1;}ret = listen(sockfd,100);if(ret == -1){perror("fail listen");return -1;}return sockfd;}int main()
{HTTP_REQ_t req;char http_buff[1024] = {0};int sockfd = sock_Init("192.168.1.150",8080);if(sockfd == -1){perror("fail sock_Init");return -1;}struct sockaddr_in cli;socklen_t addrlen = sizeof(cli);struct sockaddr_in ser;while(1){init_log();pid_t pid = fork();if(pid > 0){memset(http_buff,0,1024);int connfd = accept(sockfd,(struct sockaddr*)&cli,&addrlen);if(connfd == -1){perror("accept fail");return -1;}write_log(inet_ntoa(cli.sin_addr));// fclose(log_g.fp);recv_http_request(connfd,http_buff,sizeof(http_buff));printf("\n\n\n===========\n"); printf("http_buff = %s\n",http_buff);printf("\n\n\n===========\n"); int ret = prase_http_request(http_buff,&req);printf("url = %s\n",req.url);printf("method = %s\n",req.method);printf("content = %s\n",req.content);send_http_response(connfd,&req);close(connfd);}else if(pid == 0){memset(http_buff,0,1024);int connfd = accept(sockfd,(struct sockaddr*)&cli,&addrlen);if(connfd == -1){perror("accept fail");return -1;}write_log(inet_ntoa(cli.sin_addr));// fclose(log_g.fp);recv_http_request(connfd,http_buff,sizeof(http_buff));printf("\n\n\n===========\n"); printf("http_buff = %s\n",http_buff);printf("\n\n\n===========\n"); int ret = prase_http_request(http_buff,&req);printf("url = %s\n",req.url);printf("method = %s\n",req.method);printf("content = %s\n",req.content);send_http_response(connfd,&req);close(connfd); }}return 0;
}
http:
#include "../head.h"
#include "http.h"
char good[50][1024];
int good_num = 0;
int html_num = 0;
char *head = "<!DOCTYPE html>""<html>""<head>""<meta charset=\"utf-8\">""<title>菜鸟教程(runoob.com)</title>""</head>""<body background = \"./wyy8.png\">""<br><br><br><br><br><br><br><br><br>""<center>";
char *end = "<center>""</body>""</html>";
char INFO[5050] = {0};
char html_failname[50][50] = {0};
unsigned char FromHex(unsigned char x)
{if(0 == x ) return -1;unsigned char y;if(x>='A' &&x<='Z') y = x-'A'+10;else if(x>='a' &&x <='z') y = x-'a'+10;else if(x>='0' && x<='9') y = x-'0';return y;
}int urlDecode( char* dest, const char* src)
{if(NULL ==src || NULL == dest){return -1;}int len = strlen(src);int i =0 ;for(i = 0 ;i<len;i++){if('+' == src[i]) strcat(dest,"");else if('%'==src[i]){//if(i+2len)return -1;unsigned char high = FromHex((unsigned char)src[++i]);unsigned char low = FromHex((unsigned char)src[++i]);unsigned char temp = high*16 +low;char temp2[5]={0};sprintf(temp2,"%c",temp);strcat(dest , temp2);}}return 0;
}
int html_write(char *html_failname,char *good_content)
{int fp = open(html_failname,O_RDWR|O_TRUNC|O_CREAT,0777);if(fp == -1){perror("fail open1");return -1;}// printf("1111111111111111\n");write(fp,head,strlen(head));// printf("c=cccontent = %s\n",good_content);write(fp,good_content,strlen(good_content));write(fp,end,strlen(end));close(fp);
}int callback(void *arg,int column ,char **value,char **title)
{char info[1024] = {0};sprintf(html_failname[html_num],"./res/userdoend%d.html",html_num);sprintf(info,"<a href=\"%s\"><img src=\"%s\",width=\"150\" height=\"150\"></a>\n",html_failname[html_num],value[19]);// printf("value[17] = %s\n",value[18]);html_write(html_failname[html_num],value[18]);html_num++;strcat(INFO,info);return 0;
}int find_information(char *targe)
{sqlite3 *pdb ;char tmp_buff[1024] = {0};int ret = sqlite3_open("123.db",&pdb);if(ret != SQLITE_OK){printf("sqlite 3 open fail:%s\n",sqlite3_errmsg(pdb));return -1;}strcat(INFO,head);sprintf(tmp_buff,"select * from goods where goods_name like \"%%%s%%\";",targe);printf("targe = %s\n",targe);printf("===%s\n",tmp_buff);ret = sqlite3_exec(pdb,tmp_buff,callback,NULL,NULL);if(ret != SQLITE_OK){printf("sqlite3 callback fail :%s\n",sqlite3_errmsg(pdb));sqlite3_close(pdb);return -1;}strcat(INFO,end);html_num = 0;sqlite3_close(pdb);
}int recv_http_request(int connfd,char *http_buff,int maxnum)
{memset(http_buff,0,maxnum);ssize_t size = recv(connfd,http_buff,maxnum,0);if(size <= 0){perror("fail recv");return -1;}printf("http_buff = %s\n",http_buff);return 0;
}
int prase_http_request(char *http_buff, HTTP_REQ_t *req)
{char *p = strtok(http_buff," ");if(p == NULL){return -1;}strcpy(req->method,p);char *q = strtok(NULL," ");if(q == NULL){return -1;}strcpy(req->url,q);char *t = strtok(NULL,"\0");if(t == NULL){return -1;}t = strstr(t,"\r\n\r\n");strcpy(req->content,t+4);return 0;
}
int send_http_response_head(int connfd)
{char *phead = "HTTP/1.1 200 OK\r\n""Content-Type: text/html;charset=utf-8\r\n""Server: my-web-server\r\n" "Connection: close\r\n\r\n";ssize_t size = send(connfd,phead,strlen(phead),0);if(size <=0){perror("send fail");return -1;}
}int send_file(int connfd,char *filename)
{int fd = open(filename,O_RDONLY);if(fd == -1){perror("open fail");return -1;}char buff[1024] = {0};while(1){memset(buff,0,1024);ssize_t size = read(fd,buff,1024);if(size <= 0){break;}send(connfd,buff,size,0);}close(fd);
}int do_filename(char *filename)
{int fp = open(filename,O_WRONLY|O_TRUNC|O_CREAT,0777);if(fp == -1){perror("fail open1");return -1;}write(fp,INFO,strlen(INFO));memset(INFO,0,5050);close(fp);
}
int send_http_response(int connfd,HTTP_REQ_t *req)
{char tmp_buff[1024] = {0};char filename[1024] = {0};memset(tmp_buff,0,1024);memset(filename,0,1024);send_http_response_head(connfd);if(!strcmp(req->method,"GET")){ if(!strcmp(req->url,"/")){strcpy(filename,"./res/userin.html");}else if(strstr(req->url ,".png") || strstr(req->url , ".jpg")||strstr(req->url,".png") ){sprintf(filename,".%s",req->url);}else if(strstr(req->url,".html")){sprintf(filename,".%s",req->url);}}else if(!strcmp(req->method,"POST")){ if(strstr(req->content,"user")){ char *p = strstr(req->content,"user");p = p+5;if(!strcmp(p,"yuanjiaqing&password=aaa")){sprintf(filename,"./res/%s",req->url);}}else if(strstr(req->content,"words")){char *q = strstr(req->content,"words");q = q+6;urlDecode(tmp_buff,q);find_information(tmp_buff);printf("INFO = %s\n",INFO);sprintf(filename,"./res/%s",req->url);do_filename(filename);} }printf(" ---%s\n",filename);send_file(connfd,filename);memset(filename,0,1024);return 0;
}
log
#include <time.h>
#include <sys/stat.h>
#include <sys/types.h>#include "log.h"LOG_T log_g;int init_log(void)
{char filename[512] = {0};time_t sec;mkdir("./LOG", 0777);//Log20240525.txttime(&sec);struct tm *pt = localtime(&sec);log_g.tim = *pt;sprintf(filename, "./LOG/Log%d%02d%02d.txt", pt->tm_year+1900, pt->tm_mon+1, pt->tm_mday);log_g.fp = fopen(filename, "a");if (NULL == log_g.fp){printf("fail fopen log\n");return -1;}return 0;
}int write_log(char *aa)
{char buff[1024] = {0};time_t sec;time(&sec); struct tm *pt = localtime(&sec);//新的一天,创建新的日志文件if (pt->tm_mday != log_g.tim.tm_mday){deinit_log();init_log();}fprintf(log_g.fp, "[%d-%02d-%02d %02d:%02d:%02d][%s] \n",pt->tm_year+1900, pt->tm_mon+1, pt->tm_mday, pt->tm_hour,pt->tm_min,pt->tm_sec, aa);fflush(log_g.fp);fclose(log_g.fp);return 0;
}void deinit_log()
{if (log_g.fp != NULL){fclose(log_g.fp);}
}
相关文章:
基于Linux系统下的在线手机商城
项目背景 随着网络的发展,电子商务的兴起和普及使得消费者越来越倾向于通过互联网购买商品和服务,越来越多的传统零售商和新兴企业转向在线销售以满足消费者的需求,个成功的在线商城项目背景包括对市场需求、竞争环境、技术和平台选择、商业…...
Apache Kafka 事务详解
Apache Kafka 事务详解 Apache Kafka 是一个分布式流处理平台,主要用于实时数据的传输和处理。在现代的数据密集型应用中,事务性保证在数据传输和处理中的作用至关重要。本文将详细介绍 Kafka 的事务性支持,包括其基本概念、架构、使用方法以…...
Go语言 结构体
本文主要为Go语言 结构体介绍、语法、使用注意及其示例。 目录 结构体 语法 语法示例 语法说明 声明使用 创建并赋值 使用指针 使用注意 总结 结构体 C语言里面,我们可以使用typedef in MyInt。 在go语言中使用结构体来模拟类,使用type stru…...
数据结构(邓俊辉)学习笔记】词典 03—— 排解冲突(1)
文章目录 1. 一山二虎2. 泾渭分明3. 开放定址4. 线性试探5. 赖惰删除 1. 一山二虎 此前我们已经多次指出,对于需要动态维护的散列表冲突是不可避免的,无论你的散列函数设计的有多么精妙,因此我们不得不回答的第二个重要问题就是一旦发生冲突&…...
HTML5+CSS3-HTML5入门
1.web标准 W3C为web标准化做出了以下事项,主要包括结构,表现和行为。 结构用于对网页的信息进行分类和整理,使用技术包括HTML,XML,XHTML 表现指网页的外在样式,一般包括网页的版式,颜色,字体,…...
谷粒商城实战笔记-138-商城业务-首页-渲染二级三级分类数据
本节的主要内容是在前一节的基础上,提供结构查询出所有的二级、三级分类数据。 一,构造响应体数据结构 后端返回给前端的数据结构是在开发详细设计中应该确定的内容。 分析前端需要的数据结构,后端要将所有一级分类包含的二级和三级分类信…...
git的基础用法
文章目录 前言关联仓库提交代码分支操作账号免密 前言 记录一下git的一些基础用法。 关联仓库 # 初始化 git init# 关联仓库 git remote add origin <仓库地址># 查看当前关联的仓库 git remote -v# 一次只能remote一个,要换需要先删原来的 git remote rem…...
常见中间件漏洞(四、Apache合集)
目录 四、Apache 4.1 CVE-2021-41773 漏洞简介 影响版本 环境搭建 漏洞复现 四、Apache 4.1 CVE-2021-41773 Apache HTTP Server 路径穿越漏洞 漏洞简介 该漏洞是由于Apache HTTP Server 2.4.49版本存在目录穿越漏洞,在路径穿越目录<Directory/>Require all gra…...
HCIE-学习笔记
动态授权加入的成员优先级高于静态绑定的成员; any组(缺省):所有用户或资源,通常用来配置默认规则。any组只能做目的组,不支持配置为源组。 同一个安全组既可以与多条授权规则绑定来表示动态用户࿰…...
【计算机网络】性能指标-带宽和时延(MB、GB、KB、B、byte、bit、Mb/s、Gb/s、b/s等)学习
文章目录 1、单位换算MB、b/s1.1 在计算机领域,大写的B、K、M、G表示1.2 在通信领域,小写的k代表的是1000,不是1024,转换的时候要注意区分 2、带宽3、时延(时间消耗)4、时延带宽积5、往返时延RTT 1、单位换算MB、b/s …...
ANN(Approximate Nearest Neighbor)搜索和索引库到底是什么?
🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ ANN(Approximate Nearest Neighbor)搜索:最近邻搜索是一种在大规模数据集中快速找到与给定查询数据点距离最近的点的算法。与传统的精确最近邻搜索算法相比ÿ…...
勒索软件、供应链攻击等带来的思考!
2023年勒索软件、供应链攻击、地缘政治冲突与黑客活动主义、国家黑客间谍与APT组织活动成为网络安全的热点话题,生成式人工智能技术的武器化更是给动荡的全球网络安全威胁态势增加了不确定性、不对称性和复杂性。 即将到来的2024年,随着网络犯罪的规模化…...
【Nuxt】自定义插件和生命周期
自定义插件 方式一: app.vue // 创建插件(在app.vue中创建全局可以使用 而在某个页面中创建只有该页面可以使用) // 方式一: const nuxtApp useNuxtApp(); nuxtApp.provide("formDate", () > {return "2023-12-12"; }) nuxtAp…...
MySQL的简单介绍
文章目录 数据库关系型数据库非关系型数据”数据库的概念和用途MySQL数据库服务器、数据库和表的关系数据库的创建和删除表创建表修改常见的数据类型和约束字符串类型日期和时间类型PRIMARY KEY使用AUTO_INCREMENT使用UNIQUE使用FOREIGN KEY使用 SQL语言基础SQL语言简介SQL分类…...
leetcode 116.填充每个节点的下一个右侧结点指针
1.题目要求: 给定一个二叉树:struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。初始状态下,所有 ne…...
『 Linux 』网络基础
文章目录 协议分层OSI 七层模型TCP/IP 四层(五层)模型网络协议栈与操作系统的联系报文TCP/IP 通讯过程以太网通信的过程以太网的数据碰撞 协议分层 协议分层是计算机网络中奖网络协议进行组织和管理的方法; 通过将网络通信过程分成多个层次,每个层次负责特定的功能从而简化网络…...
Python酷库之旅-第三方库Pandas(070)
目录 一、用法精讲 281、pandas.Series.dt.daysinmonth属性 281-1、语法 281-2、参数 281-3、功能 281-4、返回值 281-5、说明 281-6、用法 281-6-1、数据准备 281-6-2、代码示例 281-6-3、结果输出 282、pandas.Series.dt.tz属性 282-1、语法 282-2、参数 282-…...
第一篇Linux介绍
目录 1、操作系统 2、Windows和Linux操作系统的区别 3、 Linux 的发行版本 4、 linux 分支 5、 Linux 的含义 6、Linux 特点 1、操作系统 常见操作系统有:Windows、MacOS、Unix/Linux。 类 UNIX Windows:其是微软公司研发的收费操作系统ÿ…...
在Windows编程中,MFC\C++中OnCopyData如何传递基础类型数据?
在C中,OnCopyData 并不是一个标准的C库或框架中的成员函数,它更常见于Windows编程中,特别是使用Win32 API或MFC(Microsoft Foundation Classes)时。OnCopyData 是一个在MFC应用程序中常用于处理来自其他应用程序的WM_C…...
10款超好用的图纸加密软件推荐,2024企业常用图纸加密软件分享
在现代企业中,设计图纸和敏感数据的安全性至关重要。一旦图纸泄露,可能会对企业造成不可估量的损失。因此,选择一款高效、可靠的图纸加密软件显得尤为重要。 1. 安秉图纸加密软件 安秉图纸加密软件是一款专为保护工程图纸和设计文件安全的软…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
