基于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. 安秉图纸加密软件 安秉图纸加密软件是一款专为保护工程图纸和设计文件安全的软…...
Kuikly实现Android iOS Web小程序一码覆盖实践
跨端开发趋势与“一码覆盖”的现实路径 在多终端普及与用户场景碎片化的背景下,移动、桌面、Web与小程序的并行发展让“一次开发、多端运行”成为开发者的核心诉求。传统方案中,React Native因桥接机制存在通信延迟与UI不一致问题,Flutter因…...
OpenClaw飞书机器人配置:SecGPT-14B安全警报实时推送
OpenClaw飞书机器人配置:SecGPT-14B安全警报实时推送 1. 为什么需要安全警报实时推送? 上周三凌晨3点,我的个人服务器突然收到异常登录告警。当我早上看到邮件时,攻击者早已完成数据窃取并抹除了痕迹。这次事件让我意识到&#…...
2026最值得投入学习的5个AI细分领域
AI重塑测试行业的转折点2026年,AI已从辅助工具进化为软件测试的核心驱动力。随着两会“深化拓展人工智能”战略的推进,测试工程师面临角色重构:从用例执行者转型为AI策略师。本文基于行业技术轨迹与人才需求,结合测试场景特殊性&a…...
qtCreator应用程序输出窗口qDebug不输出问题
可以通过配置环境变量export QT_LOGGING_RULES"*.debugtrue;qt.*.debugfalse"...
2026届必备的降AI率网站解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 可从以下方面入手,来有效降低文本被AIGC检测出的概率:一点࿰…...
合宙ESP32-C3用PlatformIO调试,别再为USB CDC和DIO配置头疼了
合宙ESP32-C3 PlatformIO调试实战:USB CDC与DIO配置全解析 第一次接触合宙ESP32-C3的开发板时,我被它简洁的设计和亲民的价格所吸引。但当我兴冲冲地打开PlatformIO准备大展拳脚时,却接连遇到了串口无法识别、程序下载失败等一系列问题。经过…...
1篇1章5节:大模型术语解读与从生成到推理的演进
在人工智能的浩瀚宇宙中,大模型正以前所未有的速度演进,推动着科技变革的新浪潮。从多模态到通用模型,再到行业模型,人工智能的边界不断拓展,为各行各业带来了全新的机遇与挑战。本篇文章将深入剖析大模型相关的核心术…...
ESPS USB MSC 调试全过程记录戎
背景 在软件开发的漫长旅途中,"构建"这个词往往让人又爱又恨。爱的是,一键点击,代码变成产品,那是程序员最迷人的时刻;恨的是,维护那一堆乱糟糟的构建脚本,简直是噩梦。 在很多项目中…...
如何轻松绕过Windows 11安装限制:终极MediaCreationTool.bat使用指南
如何轻松绕过Windows 11安装限制:终极MediaCreationTool.bat使用指南 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool…...
Python AOT编译不再依赖LLVM:2026插件如何实现纯Python源码→本地机器码直编?下载链接+SHA3-512校验值全公开
第一章:Python 原生 AOT 编译方案 2026 插件下载与安装Python 原生 AOT(Ahead-of-Time)编译方案 2026 是 CPython 官方实验性扩展项目,旨在为 Python 提供无需运行时解释器即可生成独立可执行文件的能力。该方案基于 PEP 712 和 L…...
