- 项目背景
随着网络的发展,电子商务的兴起和普及使得消费者越来越倾向于通过互联网购买商品和服务,越来越多的传统零售商和新兴企业转向在线销售以满足消费者的需求,个成功的在线商城项目背景包括对市场需求、竞争环境、技术和平台选择、商业模式和目标、以及用户体验和功能需求的全面理解和分析,越来越多的传统零售商和新兴企业转向在线销售以满足消费者的需求,所以有了在线商城项目。
- 项目功能
该服务端有四级页面,第一级为用户的用户名以及和密码的输入以及登录。第二级为用户模糊输入自己所需要商品的模糊名字后服务端将与其相关的商品罗列出来。第三级是服务器罗列出所有的相关商品,用户可以点击商品的到其具体信息。第四级是服务器输出的具体商品的信息。在每个界面用户都可以搜索。
- 项目框架
- 主要模块: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.txt
time(&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);
}
}