基于tcp,html,数据库的在线信息查询系统项目总结
1.项目背景
在线信息查询系统是一种可用于检索和展示各种信息的计算机程序或平台。主要特点包括:
用户接口:通常提供友好的界面,用户可以方便地输入查询条件。
数据存储:系统往往连接到数据库,存储大量信息,以供查询和分析。
搜索功能:支持关键词搜索、筛选和分类功能,帮助用户快速找到所需信息。
广泛运用于图书馆,企业管理等多个领域
2.项目功能
服务端创建:并发服务器,使用多进程实现,接收网页发送的报文并解析,从解析出的内容中获取网页所需要的响应报文发送给客户端,实现网页相关内容打印
Html网页接受:通过对html标记语言的拼接,实现多次输入查找内容和从数据库获得相关路径进行插入图片,文字
四级页面显示:
登录页面:用户输入登录姓名与密码进入二级查询页面
查找页面:进入查找页面输入相关商品名称
商品概述:输入名称后进入三级页面,展示所有相关的商品,由模糊查询查找相关商品
商品详细信息:点击某一商品,进入四级页面查看其具体信息
创建的服务器具备并发性能,支持多个客服端查询
将用户的访问信息存储在日志中
3.项目框架
主函数模块
数据库调用模块
服务器创建模块
登录页面模块
信息收发模块
4.项目模块分析
主函数模块 :负责各函数接口的调用
各封装函数:
1).服务器初始化 init_tcp_ser
2). 接收请求报文,存放在定义的结构体内,包含请求方法,url,内容三主题中 recv_http_req
3). 解析报文,通过tcp传输数据到用户网络(parse_http_req)
4). 接收解析信息与数据库匹配,拼接html并发送.(db_123)
5). 根据请求发送响应send_http_resp
6).信息存储功能:write_log
代码结构
头文件和库的引入
包含了一些必要的头文件,如 sqlite3.h(用于数据库操作)和自定义的头文件 head.h、123db.h 和 log.h(可能定义了功能函数和数据结构)。
全局变量
tmp_buff、head_buff、wei_buff、body_buff、goodname 等字符串数组用于存储 HTTP 响应的各个部分和数据。
主要数据结构
HTTP_R_t 结构体(假设在其他引入的头文件中定义),存储 HTTP 请求的信息,如请求方法、URL 和内容等。
函数说明
unsigned char FromHex(unsigned char x)
将十六进制字符转换为对应的整数值。
int urlDecode(char* dest, const char* src)
解码 URL 编码字符串,将 % 开头的字符解码为对应的 ASCII 字符。
int init_tcp_ser(const char *ip, unsigned short port)
初始化一个 TCP 服务器,创建一个套接字并绑定到指定的 IP 和端口。
int recv_http_req(int connfd, char *http_req,int maxlen)
从客户端接收 HTTP 请求报文,存储在 http_req 中。
int parse_http_req(char *buff,HTTP_R_t *preq)
解析接收到的 HTTP 请求报文,提取请求方法、URL 和内容,并填充到 preq 中。
int send_http_head(int connfd)
发送 HTTP 响应头部,表明服务器的响应状态和内容类型。
int send_file(int connfd,char *failname)
发送指定文件的内容到客户端。
int html_creat(char *filename,char *content)
用于创建一个 HTML 文件,并写入指定的内容。这个函数接收文件名和内容作为参数,然后将内容写入到指定的文件中。
void deinit_log()
清理日志文件或资源,通常在程序结束时调用。
日志相关函数
init_log(), write_log(), close_log(): 这些函数用于初始化日志记录、写入日志,以及关闭日志文件。打印程序运行中的信息、错误或调试信息。
主程序流程
初始化日志
int ret = init_log();
if (ret < 0) {
write_log(LOG_INFO, "初始化失败");
return -1;
}
write_log(LOG_INFO, "初始化成功");
先初始化日志,如果失败则输出日志并退出。
初始化 TCP 服务器
int sockfd = init_tcp_ser("192.168.1.195", 8080);
if (-1 == sockfd) {
perror("fail init");
return -1;
}
调用 init_tcp_ser 函数进行 TCP 服务器的初始化,这里绑定在指定的 IP 和端口。如果初始化失败,程序输出错误信息并退出。
进入主循环
while (1) {
int connfd = accept(sockfd, NULL, NULL);
...
}
进入一个无限循环,等待客户端请求。accept() 方法用于接受传入的连接。
处理客户端请求
pid_t pid = fork();
if (pid > 0) {
// 父进程
} else if (pid == 0) {
// 子进程
...
}
使用 fork() 创建一个子进程,子进程将处理客户端请求。父进程继续监听后续的客户端请求。
接收和解析 HTTP 请求
recv_http_req(connfd, http_req, sizeof(http_req));
printf("=========\n");
printf("%s\n", http_req);
printf("=========\n");
int ret = parse_http_req(http_req, &req);
if (-1 == ret) {
close(connfd);
continue;
}
子进程使用 recv_http_req() 接收来自客户端的 HTTP 请求,并打印出来,然后调用 parse_http_req() 解析请求。如果解析失败,关闭连接,并继续等待下一个请求。
发送 HTTP 响应
send_http_resp(connfd, &req);
根据解析的请求,调用 send_http_resp() 响应函数,发送处理结果给客户端。这涉及返回文件的内容,或者显示某个 HTML 页面。
关闭连接
close(connfd);
结束子进程后,关闭与客户端的连接。
结尾处理
在主循环结束后(实际上该循环并不会结束,除非手动关闭程序),程序清理包括:
反初始化日志:deinit_log();
关闭服务器套接字:close(sockfd);
总结
这个简单的 HTTP 服务器通过 TCP/IP 协议监听对指定端口的请求,接收并解析 HTTP 请求,然后生成响应返回给客户端。整个结构展示了基本的多进程处理模型,使得服务器能够同时处理多个客户端的连接请求。
相关文章:

基于tcp,html,数据库的在线信息查询系统项目总结
1.项目背景 在线信息查询系统是一种可用于检索和展示各种信息的计算机程序或平台。主要特点包括: 用户接口:通常提供友好的界面,用户可以方便地输入查询条件。 数据存储:系统往往连接到数据库,存储大量信息…...
P1032 [NOIP2002 提高组] 字串变换
[NOIP2002 提高组] 字串变换 题目背景 本题不保证存在靠谱的多项式复杂度的做法。测试数据非常的水,各种做法都可以通过,不代表算法正确。因此本题题目和数据仅供参考。 本题为搜索题,本题不接受 hack 数据。关于此类题目的详细内容 题目…...

Android 12系统源码_多屏幕(一)多屏幕设备显示Activity
前言 分屏:是指一个屏幕分出多个窗口,分别显示不同应用的界面,这在当前的手机设备中很常见。多屏:是指一个设备存在多个屏幕,这些可能是虚拟屏幕或者实体硬件屏幕,不同的应用同时显示在不同的屏幕中&#…...

如何判断IP地址属于住宅IP还是机房IP
在数字化时代,IP地址作为互联网通信的基础标识,扮演着重要的角色。无论是网络管理、数据分析还是安全监控,正确识别IP地址的类型——尤其是区分是住宅IP还是机房IP,对于确保网络安全、优化网络性能以及合法合规运营具有重要意义。IPIDEA代理I…...

C#TreeView控件应用
1、代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace TestApp…...

计算机网络-数据链路层
基本概念 数据链路和链路 链路:指的是从一个节点到相邻节点的一段物理线路,且中间没有任何其他的交换节点 数据链路:传输数据时,除了一条物理线路,还需要一些必要通信协议来控制这些传输。 数据链路层的三个基本问…...

农场游戏中的时间管理实例
一、准备工作 在Unity中创建承载日期和时间的文本 二、设置游戏的时间戳 using System.Collections; using System.Collections.Generic; using UnityEngine; //标识这个类可以被序列化 [System.Serializable] public class GameTimestamp {// 游戏时间戳的成员变量public in…...

css 数字平铺布局
效果图 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>活动中心</title><meta name"viewport" content"maximum-scale1.0,minimum-scale1.0,user-scalable0,widthdevice-width,initial-scale1.0…...

【开源】嵌入式Linux(IMX6U)应用层综合项目(2)--智能家居APP
目录 1.简介 1.1功能介绍 1.2技术栈介绍 1.3演示视频 1.4硬件介绍 2.软件设计 2.1智能家居UI设计 2.2.main函数 3.结尾(附网盘链接) 1.简介 此文章并不是教程,只能当作笔者的学习分享,只会做一些简单的介绍,其…...

CUDA常见编译器配置问题一览
CUDA常见编译器配置问题一览 关注TechLead,复旦博士,分享云服务领域全维度开发技术。拥有10年互联网服务架构、AI产品研发经验、团队管理经验,复旦机器人智能实验室成员,国家级大学生赛事评审专家,发表多篇SCI核心期刊…...
【Android】系统级应用升级后的安装位置
系统级应用的安装位置一般在codePath/system 下面, 如果手动的去进行adb install覆盖安装,通过dumpsys package可以发现是安装在/data/app/里, 如果是通过标准的系统升级方式呢? 这里我们来通过升级查看一下, 升级…...
uniapp 使用renderjs通信
一、 server层向renderjs传值,并初始化renderjs prop:可以随便定义 renderTaskDetail:是传往renderjs的数据 change:prop:prop和必须上面prop字段一样 renderScript.initAmap:【 renderScript】需要renderjs 中scr…...

PostgreSQL 15
一、安装前的准备 1、版本信息 操作系统CentOS 7.9.2009PostgreSQL 版本PostgreSQL 15-15.7 2、下载安装包 RPM Chart - PostgreSQL YUM Repositoryhttps://yum.postgresql.org/rpmchart/进入官网,找到相应版本 点击框选内容 依次进入下载页面,下载相…...

给本地设备搭建一个云端语音助手
概述 本语音助手实现了从关键词唤醒 (KWS) 到语音识别 (ASR) 再到自然语言理解 (NLU) 的完整流程。该系统可以通过监听用户的音频输入,检测指定的关键词,并将用户的语音转换为文本,最后与预设的命令进行匹配,执行相应的操作(具体实现请参考main.py),为你的设备配置远程…...

yolov5车辆类型识别TXT数据集
YOLOV5训练车辆类型识别TXT数据集, 一共1400张图片,共分7个类別, 分别为Bus,Car,SportsCar,MicroBus,Truck,SUV,Jeep是TXT格式的数据集,用LabelImg工具进行标…...

day22(mysql数据库主从搭建)
上午: 1、为mysql添加开机启动chkconfig 2、编辑配置文件my.cnf 3、修改环境变量 4、mysql角色授权 角色不生效 在配置文件中不添加activate_all_roles_on_loginon glibc安装,my.cnf在项目目录之下 rpm安装,my.cnf文件在/etc/my.cnf 5、自…...

返璞归真:通过简化用例来简化用户界面01
Larry Constantine 著harvey 译 我们常被问及精简那些最简化、抽象和通用窗体用例的重要性。到底有多重要呢?在以用户为 中心的设计中,简化那些重要窗体的用例是获得成功的关键。它能够为开发者设计优秀的用户界面 助一臂之力。通过消除不必要的或技术驱…...

书生大模型学习笔记2 - Python
Python实现wordcount 请实现一个wordcount函数,统计英文字符串中每个单词出现的次数。返回一个字典,key为单词,value为对应单词出现的次数。 解题思路:首先把字母转小写>然后把单词取出来去除标点>循环单词列表>key已存…...
JavaScript三级联动jQuery写法
HTML结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>三级联动</title><!-- <style…...
无人机挂载抓捕网
一、技术原理与机制 无人机挂载抓捕网装置的技术原理是通过无人机平台的飞行能力和灵活性,结合特制的抓捕网装置,实现对目标的快速、准确抓捕。抓捕网装置在接收到指令后,通过特定机制快速展开并包围目标,从而实现抓捕任务。 二…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...