基于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…...

无人机挂载抓捕网
一、技术原理与机制 无人机挂载抓捕网装置的技术原理是通过无人机平台的飞行能力和灵活性,结合特制的抓捕网装置,实现对目标的快速、准确抓捕。抓捕网装置在接收到指令后,通过特定机制快速展开并包围目标,从而实现抓捕任务。 二…...
174.地下城游戏——LeetCode
题目 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻…...

登录相关功能的优化【JWT令牌+拦截器+跨域】
登录相关功能的优化 登录后显示当前登录用户el-dropdown: Element - The worlds most popular Vue UI framework <el-dropdown style"float: right; height: 60px; line-height: 60px"><span class"el-dropdown-link" style"color: white;…...

向日葵没有显示器会卡住
前言 有一台机器【ubuntu20】,用于远程开发,使用向日葵时候,如果不接显示器是会卡住的。。。 显示屏是有限的,所以现在解决一下这个问题。 卡在登录界面 双击启动 由于Ubuntu默认显示管理器是gdm,而向日葵使用的是l…...

【机器学习西瓜书学习笔记——聚类】
机器学习西瓜书学习笔记【第九章】 第九章 聚类9.1 聚类任务9.2 性能度量两类指标 9.3距离计算基本性质属性有序属性无序属性 混合距离加权距离 9.4 原型聚类K-MEANS聚类算法步骤优势劣势 学习向量量化高斯混合聚类步骤难点例子EM思想的体现小结 9.5 密度聚类9.6 层次聚类 第九…...

MATLAB(8)深度变化模型
一、前言 在MATLAB中模拟深度变化模型通常依赖于具体的应用场景,比如海洋深度、地下水深度、地形高度变化等。由于“深度变化”可以涉及多种物理过程和数学模型,我将提供一个简化的示例,该示例模拟了一个基于时间变化的深度变化模型ÿ…...

mp3格式转换器哪个好用?汇总七款音频格式转换方法(无损转换)
音乐已经成为我们生活中不可或缺的一部分。但是在播放的时候,可能会遇到音频格式不兼容的情况。特别是在一些下载站或音乐平台获取的音频,有些特殊格式在播放器上无法正常播放,一般这种情况我们需要借助mp3转换器解决。 mp3是一种常见的数字音…...

移行前的复盘:CodeCommit 的重要地位分析
前言 截至7月28日,关于AWS CodeCommit的现状如下: 现有账号的现有存储库可以继续使用CodeCommit,不受限制。之前未使用过CodeCommit的账号(或没有现有存储库的账号)无法创建新的存储库。 这并不意味着CodeCommit的服…...

Java中等题-括号生成(力扣)
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n 3 输出:["((()))","(()())","(())()","()(())","()()(…...

Flink 实时数仓(八)【DWS 层搭建(二)流量域、用户域、交易域搭建】
前言 今天的任务是完成流量域最后一个需求、用户域的两个需求以及交易域的部分需求; 1、流量域页面浏览各窗口汇总表 任务:从 Kafka 页面日志主题读取数据,统计当日的首页和商品详情页独立访客数。 注意:一般我们谈到访客&…...

gitlab-runner /var/run/docker.sock connect permission denied
usermod -aG docker gitlab-runner sudo service docker restart参考:https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3492...