微型个人博客服务器

Http相关简介

Http是应用层的基于请求响应的一个协议, 其中Http的请求响应可以分为四部分. 请求行, 请求报头,空行, 请求正文.其中请求行包括了请求方法, url, 版本号, 请求报头包括请求属性, 冒分割的键值对, 每组属性之间都以换行的形式分开, 最后一空行作为请求的结束标识. 最后一部分是请求正文.当请求正文存在的时候, 会在头部信息中有一个Content_Length的属性标识正文段的长度.
Http响应也包括四部分, 响应行, 响应报头, 空行, 响应正文, 其中响应行包括版本号, 状态编号, 状态描述, 响应正文也是以key:value的形式存在, 其中每一个响应属性之间以换行为结束表示, 第三部分为空行, 最后一部分为响应正文, 其中当响应正文存在的时候, 响应报头中会存在一个Content_Length用来表示响应正文的长度

网络中数据的传输

客户端发在浏览其中输入一个url此时会经过以下几个步骤
1.客户端在浏览器输入一个url
2.浏览器查询当前浏览器的缓存, 系统缓存, 路有缓存, 如果缓存中有用户输入的url就直接将内容显示给用户, 如果没有继续查找
3.系统查找系统缓存, 查看是否有域名IP地址,如果有, 则继续查找, 如果没有, 继续查看找
4.路由器查找路由缓存, 如果有对应的IP地址则返回, 否则继续查找
5.本地域名服务器采用迭代的方式进行查询, 先向根域名服务器进行查询
6.根域名服务器告诉本地域名服务器下一次应该访问的服务器的IP地址,
7.本地域名服务器拿着这个IP地址到顶级域名服务器访问对应的资源,
8.顶级域名服务器此时告诉本地域名服务器下一次应该查询的权限域名服务器的IP地址
9.本地域名服务器此时会向权限域名服务器进行访问查询
10.权限域名服务器告诉本地域名服务器所要查询的资源对应的主机的IP地址
11.此时本地域名服务器查询到资源后将自己查询到的IP地址告诉给主机
12.主机浏览器获取到Web服务器的IP地址后,与服务器建立TCP连接
13.此时浏览器所在的客户机 通过这个IP地址给对应的服务器发送一个请求连接的报文
14.服务器接收到主机发来的请求后向客户机发出对应的应答报文,同时也给客户机发送一个请求连接报文
15.客户机接收到这个请求后给服务器发送一个确认报文
16.此时客户机和浏览器之间建立了连接完成, 开始通信
17.浏览器发出对应的文件请求
18.服务器对浏览器发出的文件请求进行响应, 将用户想要访问的信息发送给浏览器
19.浏览器释放连接, 向服务器发送一个FIN 报文
20.服务器接收到这个FIN报文的时候给对应的客户机发送一个ACK报文表名自己同意释放链接, 同时服务器会给用户发送一个FIN报文, 表名自己请求释放连接
21.客户机接收到FIN报文后给服务器发送一个ACK报文, 表名自己受到FIN报文,
22.连接释放, 双方停止发送数据

Http的特点

简单快速, 服务器的规模小, 通信速度很快
Http允许传输任意类型的数据对象, 传输的类型由Content_type标记
无连接, 每次连接只处理一个请求, 处理完请求后就进行关闭
协议本身不会保存用户请求和响应

URL & URI & URN

URI是一个统一资源标识符, 它只是一个资源的标示
URL 是一个更加具体的URI, 可以通过URL定位到该资源存放在哪里, 并且可以得知如何获取到该资源.每个网页都对应一个URL地址(俗称网址),具有全球唯一性。它包含的信息指出文件的位置以及浏览器应该怎么处理它。 一个完整的URL包括协议类型、主机类型、路径和文件名
URN 通过名字标识一个资源

Http请求方法

GET方法
如果浏览器访问资源的方法是GET方法, 此时就会将用户请求的关键字拼接到URL后面, 同时GET方法可能带参数也可能不带参数
POST方法
POST方法不会将用户提交上去的数据放到url中, 它会将用户提交上去的数据放到正文中

CGI

浏览器除了从服务器上获取一些资源之外, 有时还需要向服务器上提交一些数据, 为了实现网页的交互性, 此时就需要以CGI机制来运行
当用户访问的资源具有可执行的时候, 此时程序就要以CGI的形式进行运行, 其中CGI的运行有两种可能, 一种是当请求的方法是POST, 另外一种就是当请求的资源是GET, 并且在URL中带了参数, 此时的运行方式即就是CGI运行方式

Http响应状态码及其描述

2XX成功

200: 请求访问被正确处理
204: 请求结果被正确处理, 但是响应信息没有响应正文
206: 客户端对服务器进行了范围请求, 服务器成功执行了GET 请求, 响应报文包含了Content-Range指定的实体内容范围

3XX成功

浏览器为了正确出处理请求需要执行一些特殊的处理动作
301永久性重定向:资源被重新分配了新的url, 要想访问该资源就得以新的url去访问资源
302临时性重定向: 目标资源暂时被分配了新的url,需要访问就得以新的url进行访问

4XX客户端错误

400 请求错误:表示请求报文中存在语法错误, 服务器无法解析该请求, 需要修改请求内容, 重新发送.
403 浏览器访问的资源被服务器拒绝. 服务器没有必要给出详细的理由
404 请求的资源不存在

5XX服务器错误

500 服务器端在执行的时候发生了错误
503 服务器处于超载状态, 目前正在维护, 无法请求处理.

MySlq相关接口

mysql_get_client_info()//引入对应的MySql库
MySql* mysql_init(MySql* mysql);//初始化
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,const char *user,const char *passwd,const char* db,unsigned int port,const char* unix_socket,unsigned long clientflag);//连接数据库int mysql_query(MYSQL* mysql, const char* q);//下发MySql命令MYSQL_RES *mysql_store_result(MYSQL* mysql);//读取结果unsigned int mysql_num_fields(MYSQL_RES *res);//获取列数MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);//获取列名void mysql_close(MYSQL* sock);//关闭MySql连接

项目分析

1.用户在浏览器上输入一个url
2.服务器将用户的请求进行分析, 向用户发出Http响应, 最终将用户请求的资源以一个html页面展示给用户
3.当用户请求的资源是一个可执行程序的时候, 此时就会进行简单的cgi运行, 最终将运行的结果展示给用户
4.当用户输入数据, 服务器将对应的数据插入到数据库中
5.服务器将对应的数据库的信息以html页面的格式展示给用户

项目实现思路

1.创建套接字
2.将对应的请求处理(将所有的换行都转换为反斜杠n)
3.对读取到的请求报文进行分析, 提取对应的方法, 判断该方法是GET 方法还是POST方法
4.如果是GET方法, 就直接判断资源请求的资源是否存在, 资源如果存在, 就将该资源返回给用户, 如果该资源不存在, 就返回404页面, 如果请求的资源是一个目录就将返回一个首页给浏览器
5.如果是POST方法, 就以cgi机制运行, 同时将正文的长度获取, 以进行参数获取

项目中的CGI运行机制

首先判断方法是GET 还是POST, 如果是GET方法, 那么此时的参数已经获取到(通过url放到了对应的query_string 中)此时就将请求行请求正文全部读完, 如果是POST方法, 此时就需要读取请求报头获得Content_length, 通过Content_length获取参数.然后将发送响应行首信息.此时就会出现一个问题, 既然是CGI机制, 那么就需要在一个集成中取执行另一个可执行程序, 此时就需要创建一个子进程, 但是子进程和父进程之间是独立的, 父进程想要拿到子进程的运行结果就必须将两个进程之间进行关联, 此时就需要引入管道实现进程间通信.
子进程需要执行另外一个可执行程序的话就需要程序替换, 程序替换回将当前的数据和代码全部替换, 此时如果将其替换掉, 子进程还怎么拿到对应的数据, 这个时候就引入了环境变量, 为了读写方便, 将管道直接重定向到对应的0和1中, 此时父进程只需要将子进程的执行结果拿到之后将其交给浏览器即可, 子进程只需要从父进程那里将数据拿到即可
总结一下:
父进程:
创建两个管道, 关闭相应的文件描述符
POST:继续读取数据, 直到读完POST的参数部分
GET直接从子进程那里读取结果
将数据和方法全部交给子进程等待子进程结果
子进程:
关闭相应的文件描述符
重定向标准输入标准输出
通过环境变量传去参数
进程程序替换

错误处理

将对应的请求处理完之后, 发出对应的响应, 然后在正文中将404页面发出去

部分图片展示

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

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

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

相关文章

HDU6428-Calculate-数论函数

并不知道为什么同样一份代码早上超时下午就A了…好像数据是随机的? 做的第一道不是简单板题的数论函数题.果然做不出来… 在网上研究了好久,才算稍微研究明白.看到了两种推导的思路.(写了半天发现讲起来好麻烦,有时间再来更新) #include<cstdio> #include<cstring&g…

[C/C++]关于C++11中的std::move和std::forward

http://blog.sina.com.cn/s/blog_53b7ddf00101p5t0.htmlstd::move是一个用于提示优化的函数&#xff0c;过去的c98中&#xff0c;由于无法将作为右值的临时变量从左值当中区别出来&#xff0c;所以程序运行时有大量临时变量白白的创建后又立刻销毁&#xff0c;其中又尤其是返回…

BZOJ3930-莫比乌斯反演+杜教筛

题目的意思很简单&#xff0c;求给定区间内的gcdk的个数&#xff0c;这应该是传统的莫比乌斯反演了。 有两种思路&#xff0c;一种是直接将里面变成gcd1&#xff0c;然后里面看作元函数用莫比乌斯函数和恒等函数展开&#xff0c;然后改变求和顺序。 还有一种是构造两个函数&…

HDU1999不可摸数-暴力打表

看到这约数和第一反应是约数和函数&#xff0c;然后仔细一看不是正经的约数和函数&#xff0c;就去推去了&#xff0c;然后推的有点小复杂。&#xff08;数论函数那部分做多了&#xff09; 然后观察也没有用到什么数论部分的特殊知识啊&#xff0c;难不成真的要暴力&#xff1f…

BZOJ2818-莫比乌斯反演/欧拉函数

这道题之前没有看数论函数的时候搞懂了,想到直接用欧拉函数做,现在再来看第一个想法就是这不是莫比乌斯反演嘛. 但还是能用简单数论知识直接做出来的还是尽量做简单一点. 两种方法想到后都写的差不多对了,都爆long long 了.万恶的long long .实在是烦.切记切记,只要是乘积,或…

epoll用法整理 实现回声服务端

http://blog.csdn.net/chenxun_2010/article/details/504934811、epoll是什么&#xff1f; epoll是当前在Linux下开发大规模并发网络程序的热门人选&#xff0c;epoll 在Linux2.6内核中正式引入&#xff0c;和select相似&#xff0c;都是I/O多路复用(IO multiplexing)技术。 Li…

HDU3430-扩展中国剩余定理

刚开始一直把题意看错了。。。体测完智商急剧下降 正确理解题意以后自己写一直wa&#xff0c;而且并不知道是哪里的问题&#xff0c;在网上看了一下其他人写的改了改自己的就过了&#xff0c;可是之前的还是不知道为什么不对。 题意大概就是有一个置换群&#xff0c;问运算多…

linux shell编程多线程和wait命令学习

http://blog.csdn.net/shuanghujushi/article/details/38186303最近在使用shell做一些部署工作&#xff0c;在使用过程中&#xff0c;效率一直不高。想提高效率&#xff0c;经过分析发现&#xff0c;并不是所有操作都是需要串行的&#xff0c;一些操作是可以进行并行操作的。经…

#ifndef的作用

#ifndef是一条预编译指令&#xff0c;就是说实在编译的时候就会运行的指令。这个指令的作用很简单&#xff0c;就是字面意思&#xff0c;如果没有定义的话&#xff0c;但是却经常使用。 因为使用这个可以避免一个源文件中两次两次包含同一个文件&#xff0c;或者一个工程文件中…

C++中结构体和类的区别和联系

最主要的不同点就是结构体的访问权限为public而且不能改变&#xff0c;而类的访问权限可以改变&#xff0c;public的类和结构体基本一样。 继承上同样表现出这样的特点&#xff0c;struct是public继承的&#xff0c;而class是private继承的&#xff0c;继承的子类的访问权限取…

poll函数实现多路复用

http://blog.csdn.net/xluren/article/details/8206371 结构体pollfd struct pollfd { int fd; //file descriptor short event; //event of interest on fd short reven; //event that occurred on fd } 每一个pollfd结构体指定了一个被监视的文件描述符&…

抽象类(纯虚函数、虚函数)和虚基类(虚继承)

C多态 C的多态包括静态多态和动态多态&#xff0c;静态多态包括函数重载和泛型编程&#xff0c;动态多态包括虚函数。静态多态实在编译期间就能确定&#xff0c;动态多态实直在程序运行时才能确定。 抽象类 虚函数 在默认情况下对函数成员调用实施的是静态连编&#xff0c;…

socket通信之最简单的socket通信

http://blog.csdn.net/xluren/article/details/8043484#t15 套接字有三种类型 流式套接字&#xff08;SOCK_STREAM&#xff09;&#xff0c;数据报套接字&#xff08;SOCK_DGRAM&#xff09;及原始套接字。 1.流式套接字提供面向连接、可靠的数据传输服务&#xff0c;数据按字节…

Java环境配置

自己安装的时候按照一般的安装方法先配置了JDK的环境&#xff0c;能够成功显示java版本后我在安装eclipse的时候一直提示错误&#xff1a; Unfortunately the Java version needed to run Eclipse Installer couldn’t be found on your system. You need the following versio…

Linux I/O复用之select函数详解

http://blog.csdn.net/y396397735/article/details/55004775 select函数的功能和调用顺序 使用select函数时统一监视多个文件描述符的&#xff1a; 1、 是否存在套接字接收数据&#xff1f; 2、 无需阻塞传输数据的套接字有哪些? 3、 哪些套接字发生了异常&#xff1f; sel…

【Java学习笔记一】类和对象

面向对象程序设计的一个一个重要特点是&#xff1a;封装性。 这里的封装性有两方面含义&#xff1a;一是将有关的数据和操作代码封装在一个对象中形成一个基本单位&#xff0c;各个对象之间相互独立互不干扰&#xff0c;二是将对象中某些部分对外隐蔽&#xff0c;即隐蔽其内部细…

深入研究socket编程(3)——使用select函数编写客户端和服务器

http://blog.csdn.net/chenxun_2010/article/details/50488394 首先看原先《UNIX网络编程——并发服务器&#xff08;TCP&#xff09;》的代码&#xff0c;服务器代码serv.c&#xff1a; [cpp] view plaincopy #include<stdio.h> #include<sys/types.h> #inclu…

Java简单输入输出

不同于面向过程中有直接的输入输出函数&#xff0c;Java中的输入输出只能通过类来实现。 比较常见的一种是使用Scanner类 需要引入java.util包&#xff0c;即在文件开始加上语句import java.util.*;创建Scanner类对象&#xff0c;属于标准输入流。 例如Scanner snew Scanner(S…

Ubuntu安装搭建Clion环境

呜呜呜&#xff0c;太辛苦了&#xff0c;我终于安装好这个了。 大概过程就是先在官网下载安装包&#xff0c;然后解压以后用终端移动到对应文件夹下运行clin.sh 运行完以后会有一些窗口&#xff0c;第一个选择don’t~~&#xff0c;然后点击ok 接受&#xff08;你可以不接受…

UNIX网络编程——select函数的并发限制和 poll 函数应用举例

http://blog.csdn.net/chenxun_2010/article/details/50489577 一、用select实现的并发服务器&#xff0c;能达到的并发数&#xff0c;受两方面限制 1、一个进程能打开的最大文件描述符限制。这可以通过调整内核参数。可以通过ulimit -n来调整或者使用setrlimit函数设置&#x…