基于TCP的web端服务器数据库查询商品

news2024/9/25 1:25:55
  1. 背景描述

该系统为创建网络并发服务器,搭建HTML网络页面框架,通过HTTP超文本网络传输与用户建立连接(TCP建立连接),从自己建立的数据库中查询用户所需信息,使用户能在网页中直接查询相关内容。本系统包括4个页面,包括(一级登陆页面,二级商品查询信息页面,三级商品概述页面,四级商品详情页面),使用户可以精准查询。

  1. 项目框架

2.1主要功能框图

2.2系统结构框图

  1. 数据库查询

  1. 模块介绍

网页界面:分为四级网页界面:分别是登录页面,查询页面,商品页面,商品详情页面

登录页面:输入账号和密码

查询页面:输入待查询的商品名称

商品页面:展示所有匹配到的商品

商品详情页面:展示用户所有商品的详细信息,包括参数,价格等

  1. 详细设计文档

3.1数据输入与显示

流程图:(附录)

3.2网络模块

接口说明:

接口选项

参数说明

返回值

接口描述

1.init_tcp

本机作为服务器的ip以及用http协议创建连接的端口号。

待绑定的套接字

初始化 TCP 连接 ,这个函数正确地设置了 socket 选项,绑定了 IP 地址和端口,并开始监听连接。

2recv_http_request

已经accept后的套接字connfd,接收到的http请求,请求的大小。

接收到的请求报文的大小

接收 HTTP 请求 ,这个函数从客户端读取 HTTP 请求。

3.parse_http_req

接收到的http请求。

解析 HTTP 请求 ,这个函数使用 strtok 来解析请求方法、URL 和内容

4.Callback/callback2

callback函数的固定参数

处理从 SQLite 查询返回的数据

5find_pictures

connfd,拼接好的一部分报文,需要在数据库查找的数据名

SQLite 数据库中查询数据,并使用回调函数发送响应

6.find_detail

connfd,拼接好的一部分报文,需要在数据库查找的数据名

SQLite 数据库中查询数据,并使用回调函数发送响应

7.send_http_head 和 send_http_file

connfd

用于构建和发送 HTTP 响应

8.send_http_response

connfd

根据请求的 URL 和方法来决定发送什么内容

实现代码:

主要部分: 

#include<stdio.h>
#include <sqlite3.h>
#include "net.h"
int lead;

int recv_http_request(int connfd,char *http_req,int maxlen);
int parse_http_req(char *http_req,HTTP_REQ_text *phttp);
int callback(void *arg,int column_cnt,char **column_value,char **column_name);
int find_images(int connfd,char file[1024]);
int send_http_head(int connfd);
int send_http_file(int connfd,char *filename);
int send_http_response(int connfd,HTTP_REQ_text *phttp);

char name_buf[512] = {0};

int init_tcp(const char *ip,  unsigned short port)
{
	int option,optlen;
    int socfd = socket(AF_INET,SOCK_STREAM,0);
    if(socfd < 0)
    {
        perror("fail socket");
        return -1;
    }

    optlen = sizeof(option);
    option = 1;
    setsockopt(socfd,SOL_SOCKET,SO_REUSEADDR,(void *)&option,optlen);
    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(socfd,(struct sockaddr *)&ser,sizeof(ser));
    if(-1 == ret)
    {
        perror("fail bind");
        return -1;
    }

    ret = listen(socfd,128);
    if(-1 == ret)
    {
        perror("fail listen");
        return 0;
    }

    return socfd;
}

int recv_http_request(int connfd,char *http_req,int maxlen)
{
    lead = connfd;
    memset(http_req,0,maxlen);
    ssize_t size = read(connfd,http_req,maxlen);
    if(size <= 0)
    {
        perror("read error");
        return 0;
    }

    printf("------------http_req-----------\n");
    printf("%s\n",http_req);
    printf("-------------------------------\n");
    return size;
}

int parse_http_req(char *http_req,HTTP_REQ_text *phttp)
{
    memset(phttp,0,sizeof(HTTP_REQ_text));
    if(NULL == http_req || NULL == phttp)
    {
        return -1;
    }

    char *p = strtok(http_req," ");
    if(NULL == p)
    {
        return -1;
    }
    strcpy(phttp->method,p);
    
    p = strtok(NULL," ");
    if(NULL == p)
    {
        return -1;
    }
    strcpy(phttp->url,p);

    p = strtok(NULL,"\0");
    if(NULL == p)
    {
        return -1;
    }
    p = strstr(p,"\r\n\r\n");
    if(NULL == p)
    {
        return -1;
    }
    if(strcmp(p+4,"commodity"))
    {
        char old_buf[1024] = {0};
        strcpy(old_buf,p + 14);
        char new_buf[1024] = {0};
        urlDecode(new_buf,old_buf);
	    printf("%s\n",new_buf);
        strcpy(phttp->content,new_buf);
    }
    else
    {
        strcpy(phttp->content,p +4);
    }
    
    return 0;
}

int callback(void *arg,int column_cnt,char **column_value,char **column_name)
{
        printf("**********%s********\n",column_value[0]);
        char buf[1024] = {0};
        sprintf(buf,"<a href= 'describe.html?goods_sn=%s'><img src=\"./%s\"></a>",column_value[1],column_value[0]);
        ssize_t size = send(lead,buf,strlen(buf),0);
        if(size < 0)
        {
            perror("fail send");
            return -1;
        }
        return 0;
}

int callback1(void *arg,int column_cnt,char **column_value,char **column_name)
{
    char buf[40960] = {0};
    sprintf(buf,"<img border=\"0\" src=\"%s\" alt=\"%s\">\n"
    "<p>%s</p>\n""<p>%s</p>\n"
    "<p>%s</p>",column_value[20],column_value[3],column_value[16],column_value[18],column_value[11]);
    ssize_t size = send(lead,buf,strlen(buf),0);
    if(size < 0)
    {
        perror("fail send2");
        return -1;
    }
    for(int i = 0;i <column_cnt;++i)
    {

    }
    return 0;
}

int find_pictures(int connfd,char file[1024],char *name)
{
    sqlite3 *pdb;
    int ret = sqlite3_open("./123.db",&pdb);
    if(ret != SQLITE_OK)
    {
        fprintf(stderr,"sqlite3_exec fail:%s\n",sqlite3_errmsg(pdb));
        sqlite3_close(pdb);
        return -1;
    }
    
    char find[1024] = {0};
    sprintf(find,"select goods_img,goods_sn from goods where goods_name like \"%%%s%%\";",name);
    char *sql = find;
        
    printf("sql = %s\n", sql);
    ret = sqlite3_exec(pdb,sql,callback,NULL,NULL);
    if (ret != SQLITE_OK)
	{
		fprintf(stderr,"sqlite3_exec fail : %s\n", sqlite3_errmsg(pdb));
		sqlite3_close(pdb);
		return -1;
	}


    sqlite3_close(pdb);
	return 0;
}

int find_detail(int connfd,char file[1024],char *name)
{
    sqlite3 *pdb;
    int ret = sqlite3_open("./123.db",&pdb);
    if(ret != SQLITE_OK)
    {
        fprintf(stderr,"sqlite3_open fail:%s\n",sqlite3_errmsg(pdb));
        sqlite3_close(pdb);
        return -1;
    }
    
    char find[1024] = {0};
    sprintf(find,"select * from goods where goods_sn = \"%s\";",name);
    char *sql = find;
    printf("**************%s\n",sql);
    ret = sqlite3_exec(pdb,sql,callback1,NULL,NULL);
    if (ret != SQLITE_OK)
	{
		fprintf(stderr,"sqlite3_exec fail : %s\n", sqlite3_errmsg(pdb));
		sqlite3_close(pdb);
		return -1;
	}
    sqlite3_close(pdb);
    return 0;
}

int send_http_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: keep-alive\r\n\r\n";
    ssize_t size = send(connfd,phead,strlen(phead),0);
    if(size <= 0)
    {
        perror("send http_head fail");
        return -1;
    }

    return 0;
}

int send_http_file(int connfd,char *filename)
{
    char buf[1024] = {0};

    int fd = open(filename,O_RDONLY);
    if(fd <= 0)
    {
        perror("fail open file");
        return -1;
    }

    while(1)
    {
        ssize_t size = read(fd,buf,sizeof(buf));
        if(size <= 0)
        {
            break;
        }

        send(connfd,buf,size,0);
    }

    close(fd);
    return 0;
}

int send_http_response(int connfd,HTTP_REQ_text *phttp)
{
    char file[1024] = {0};
    send_http_head(connfd);
    char *q= phttp->url;
    char *p;
    p = strtok(phttp->url,"?");
    q = strtok(NULL,"\0");
    printf("****%s\n",q);
    if(!strcmp(phttp->method,"GET"))
    {
        if(!strcmp(phttp->url,"/"))
        {
            sprintf(file,"./resorce/html  sorce/login.html");
            send_http_file(connfd,file);
            return 0;
        }
        else if(strstr(phttp->url,".jpg") || strstr(phttp->url,".png"))
        {
            sprintf(file,"./%s",phttp->url);
            send_http_file(connfd,file);
            return 0;
        }
        else if(!strcmp(phttp->url,"/favicon.ico"))
        {
            return 0;
        }
        else if(strstr(phttp->url,"ECS"))
        {
            int i = 1;
            sprintf(file,"./%s",phttp->url);
            send_http_file(connfd,file);
            return 0;
        }
        else if(strstr(phttp->url,"/describe.html"))
        {
            sprintf(file,"./resorce/html  sorce/%s",phttp->url);
            send_http_file(connfd,file);
            //find_detail(connfd,file,name_buf);
            char *address;
            address= index(q,'E');
            printf("address = %s\n",address);
            find_detail(connfd,file,address);
            return 0;
        }
    }
    else if(!strcmp(phttp->method,"POST"))
    {
        if(!strcmp(phttp->url,"/find.html"))
        {
            sprintf(file,"./resorce/html  sorce%s",phttp->url);
            send_http_file(connfd,file);
            return 0;
        }else if(!strcmp(phttp->url,"/commodity.html"))
        {
            sprintf(file,"./resorce/html  sorce/%s",phttp->url);
            send_http_file(connfd,file);
            strcpy(name_buf,phttp->content);
            //printf("name = %s\n",name_buf);
            find_pictures(connfd,file,name_buf);
            return 0;
        }
    }

}

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

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

相关文章

Elasticsearch设置密码报错:ERROR: X-Pack Security is disabled by configuration.

elasticsearch@6ef6c3f5ee45:~$ bin/elasticsearch-setup-passwords auto Unexpected response code [405] from calling GET http://172.17.0.2:9200/_security/_authenticate?pretty It doesn’t look like the X-Pack security feature is enabled on this Elasticsearch n…

Meshy-4:AI驱动3D建模的革命性工具,解锁虚拟创作新高度

Meshy发布了最新的AI驱动3D建模工具——Meshy-4&#xff0c;这是虚拟环境创作领域的一大进步。对设计师和开发者来说&#xff0c;Meshy-4的出现不仅是技术上的飞跃&#xff0c;更是创作效率的极大提升。 Meshy-4的亮点与功能 1. 更清晰、更专业的AI生成3D模型&#xff1a; Mes…

沉浸式体验:ARM 工控机携手 HT for Web 打造智能建筑监控

工业领域技术的进步不断推动着生产和管理方式的革新。随着物联网、大数据、云计算等技术的发展&#xff0c;工业自动化和信息化融合的趋势日益明显。在这样的背景下&#xff0c;HT for Web 和 ARM 工业计算机成为了工业智能化道路上的重要工具。 HT for Web 是一款基于WebGL的高…

2024国赛数学建模备赛|30种常用的算法模型之最优算法,线性规划

1.最优化理论基础 1.1 最优化问题的数学模型 通俗地说&#xff0c;所谓最优化问题&#xff0c;就是求一个多元函数在某个给定集合上的极 值. 几乎所有类型的最优化问题都可以用下面的数学模型来描述: 这里&#xff0c;&#x1d43e; 是某个给定的集合 (称为可行集或可行域)&a…

ffmpeg 视频编码及基本知识

理论 H264编码原理&#xff08;简略&#xff09; 1. 视频为什么需要进行编码压缩 降低视频数据大小&#xff0c;方便存储和传输 2. 为什么压缩的原始数据采用YUV格式 彩色图像的格式是 RGB 的&#xff0c;但RGB 三个颜色是有相关性的。 采用YUV格式&#xff0c;利用人对图像的…

LoRa芯片在RX时产生的中断顺序QA

目录 1 前言2 问题集锦及解答2.1 radio芯片在接包时&#xff0c;preamble、header和Rx done三个中断产生顺序是怎么样的&#xff1f;谁先谁后&#xff1f;2.2 产生了Header error中断后&#xff0c;radio芯片会继续接收本包还是立马丢弃本包&#xff1f;2.3 产生了CRC error中断…

语言中的类型转换

编程语言中必然有很多情况需要转换类型。比如引入const的概念就为了提高安全性&#xff0c;编译器提前检查&#xff0c;避免一些意外修改。当然&#xff0c;有时&#xff0c;我们希望手动转换一个变量的类型&#xff0c;让其变成常量&#xff0c;可以利用编译器提供的cast方法。…

保隆科技半年报:净利同比下滑近两成,ADAS/空悬业务仍亏损

2024年上半年&#xff0c;在全球产业链调整、局部战争仍未平息等事件长期影响下&#xff0c;叠加主要经济体货币政策调整、债务风险上升等周期性因素&#xff0c;全球经济复苏面临较大不确定性&#xff0c;汽车市场尚处在缓慢恢复阶段。 这也导致不少汽车零部件上市公司的半年报…

SQL语言的规则和规范

规则 是什么呢&#xff0c;规则就是我们最基本&#xff0c;每时每刻都要遵守的比如人行道靠右&#xff0c;不能逆行&#xff0c; 规范 呢就是锦上添花&#xff0c;如果你不这么做&#xff0c;是不那么道德&#xff0c;不那么好的&#xff0c;就像小学生见到老师要问好&#…

SAP HCM 如何追踪Z表的日志修改记录

导读 INTRODUCTION 日志记录&#xff1a;这几天遇到一个问题&#xff0c;就是查谁修改Z表的数据&#xff0c;因为HCM系统大部分都是信息类型&#xff0c;信息类型修改是有专门一套的处理机制&#xff0c;那么Z开头的表是不是也有追踪的一套机制。今天我们分析下如何开启Z表追…

新生自我介绍ppt怎么做?用这款在线PPT软件一键自动生成!

新学期伊始&#xff0c;初一新生除了适应新的学习环境&#xff0c;还要制作新生自我介绍ppt&#xff0c;让同学们更好地相互了解彼此&#xff0c;自我介绍成为了一项重要的流程。制作一份精美的自我介绍PPT&#xff0c;无疑能够让你在新班级中脱颖而出&#xff0c;给同学们留下…

Mysql之存储引擎概述

文章目录 存储引擎MySQL体系结构存储引擎特点InnoDBMyISAMMemory总结 存储引擎选择 存储引擎 MySQL体系结构 连接层&#xff1a;最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所…

基于python学生信息成绩的管理系统设计与实现,很详细!

需求分析 1.1数据操纵 &#xff08;1&#xff09;录入并保存学生的基本信息及选课信息&#xff08;如学号、姓名、性别、专业、课程名称、课程成绩&#xff09;&#xff1b; &#xff08;2&#xff09;可以对已经保存的学生基本信息及选课信息进行修改&#xff1b; &#x…

字符串(4题)

目录 1.最长公共前缀 2.最长回文串 3.二进制求和 4.字符串相乘 1.最长公共前缀 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string longestCommonPrefix(vector<string>& strs) {string ret;int cur 0;while(1){if(strs[0].size() cu…

YOLOv8改进 | 模块缝合 | C2f 融合REPVGGOREPA提升检测性能【详细步骤 完整代码】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

记一种常用的实时数据同步方案:Canal+Kafka+Flume

记一种常用的实时数据同步方案&#xff1a;CanalKafkaFlume 在当今数据驱动的业务环境中&#xff0c;数据同步是确保系统间数据一致性的关键环节。一种高效、稳定且可扩展的数据同步方案对于支撑企业的数据处理和分析需求至关重要。本文将介绍一种结合了Canal、Kafka和Flume的…

【unity游戏开发】Blender导出到Unity,带texture

【背景】 上一篇完成了将Mixamo的动画应用到blender的fbx模型中。但是默认配置导出fbx又导入Unity后发现Texture都没了(mesh和rig都在)。如何将Texture也一并导入呢? 【要点】 Blender导出后的FBX展开Mesh的名称不是文件名称,而是同Blender中的Mesh名称。可以根据这一点…

【案例66】支付指令客户端崩溃分析全过程

问题现象 月底&#xff0c;需要给人员开工资&#xff0c;但是财务人员在点击【支付状态指令】节点&#xff0c;点击状态确认后&#xff0c;系统直接崩溃&#xff0c;页面都卡掉。人员已经2天未发工资&#xff0c;情况比较紧急。 更改Uclient模式从分离模式改为嵌入模式&#x…

【linux002】目录操作命令篇 - ls 命令

文章目录 1、基本用法2、常见选项3、举例演示4、注意事项 ls 命令在 Linux 中用于列出目录内容。它有许多选项和参数可以用来调整显示的格式和内容。 1、基本用法 ls [选项] [文件或目录]2、常见选项 -a 或 --all&#xff1a;显示所有文件&#xff0c;包括以点.开头的隐藏文件…