微型个人博客服务器

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,一经查实,立即删除!

相关文章

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

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

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

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

深入研究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…

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…

【Java学习笔记二】继承和多态

与C不同的是&#xff0c;在Java中&#xff0c;一个类只能直接继承另一个类&#xff0c;而不允许继承多个类&#xff0c;这个新类称为继承类、派生类或者子类&#xff0c;而被继承的类称为基类或者父类。 继承类能够继承基类的群不属性和行为。 面向对象程序设计的三大特点为&…

Linux系统编程——线程池

http://blog.csdn.net/tennysonsky/article/details/46490099# 线程池基本原理 在传统服务器结构中&#xff0c;常是有一个总的监听线程监听有没有新的用户连接服务器&#xff0c;每当有一个新的用户进入&#xff0c;服务器就开启一个新的线程用户处理这 个用户的数据包。这个线…

简单Linux C线程池

http://www.cnblogs.com/venow/archive/2012/11/22/2779667.html 大多数的网络服务器&#xff0c;包括Web服务器都具有一个特点&#xff0c;就是单位时间内必须处理数目巨大的连接请求&#xff0c;但是处理时间却是比较短的。在传统的多线程服务器模型中是这样实现的&#xff1…

IO多路复用之poll总结

http://www.cnblogs.com/Anker/p/3261006.html 1、基本知识 poll的机制与select类似&#xff0c;与select在本质上没有多大差别&#xff0c;管理多个描述符也是进行轮询&#xff0c;根据描述符的状态进行处理&#xff0c;但是poll没有最大文件描述符数量的限制。poll和select同…

【C++学习笔记二】C++继承

继承 继承允许我们一句另一个类来定义一个类&#xff0c;这使得继承和维护一个程序变得更加容易&#xff0c;也达到了重用代码功能和提高执行效率的效果。 一般格式为&#xff1a; class 派生类名 :访问修饰符 基类名{};其中访问修饰符是public protected private中的一个&a…

处理大并发之二 对epoll的理解,epoll客户端服务端代码

http://blog.csdn.net/wzjking0929/article/details/51838370 序言&#xff1a; 该博客是一系列的博客&#xff0c;首先从最基础的epoll说起&#xff0c;然后研究libevent源码及使用方法&#xff0c;最后研究nginx和node.js&#xff0c;关于select,poll这里不做说明&#xff0c…

C++基类指针指向派生类(指针)

我们常用基类指针指向派生类对象来实现多态性。 私有继承不允许基类指针指向派生类 基类指针只能访问到基类中含有的公有成员。 当用基类指针指向派生类对象在动态分配堆上内存的时候&#xff0c;析构函数必须是虚函数! 成员如果是数据成员的话访问的是基类的版本&#xff…

一个简单的linux线程池

http://blog.csdn.net/wzjking0929/article/details/20312675 线程池&#xff1a;简单地说&#xff0c;线程池 就是预先创建好一批线程&#xff0c;方便、快速地处理收到的业务。比起传统的到来一个任务&#xff0c;即时创建一个线程来处理&#xff0c;节省了线程的创建和回收的…

C++制表符

制表符的转义字符为\t&#xff0c;一般情况下长度为8个空格&#xff0c;这里的8个指的是从上一个字符串的开头开始算&#xff0c;往后数8个&#xff0c;不够的话就补空格。 如果前面的字符串的长度大于等于8个&#xff0c;例如前面字符串的长度为x,那么就会补(8-x%8)个空格 例…

C++派生类含有成员对象构造函数析构函数顺序

参考博客&#xff1a;传送门1 当类中含有对象成员时&#xff1a; 类的构造函数要包含对成员对象的初始化&#xff0c;如果构造函数的成员初始化列表没有包含对成员对象的初始化&#xff0c;系统会自动调用成员对象的无参构造函数。顺序上&#xff1a;先调用成员对象的构造函数…

链表逆序的原理及实例

http://blog.csdn.net/wangqing_12345/article/details/51757294 尾插法建立链表&#xff0c;带头结点设链表节点为typedef struct node {int data;struct node *next;}node_t, *pnode_t;要求将一带链表头List head的单向链表逆序。 分析&#xff1a; 1). 若链表为空或只有一个…

C++关于虚基类、构造函数、析构函数、成员对象的两个程序浅析

预备博客&#xff1a; C虚继承中构造函数和析构函数顺序问题以及原理 C派生类含有成员对象构造函数析构函数顺序 C虚基类成员可见性 程序一如下&#xff1a; #include<iostream> using namespace std; class A { public:A(int a) :x(a) { cout << "A const…

C++小型公司管理系统

项目要求&#xff1a; 编写一个程序实现小型公司的人员信息管理系统。该公司雇员&#xff08;employee&#xff09;包括经理&#xff08;manager&#xff09;&#xff0c;技术人员&#xff08;technician&#xff09;、销售员&#xff08;salesman&#xff09;和销售部经理&…

Linux网络编程“惊群”问题总结

http://www.cnblogs.com/Anker/p/7071849.html 1、前言 我从事Linux系统下网络开发将近4年了&#xff0c;经常还是遇到一些问题&#xff0c;只是知其然而不知其所以然&#xff0c;有时候和其他人交流&#xff0c;搞得非常尴尬。如今计算机都是多核了&#xff0c;网络编程框架也…

yfan.qiu linux硬链接与软链接

http://www.cnblogs.com/yfanqiu/archive/2012/06/11/2545556.html Linux 系统中有软链接和硬链接两种特殊的“文件”。 软链接可以看作是Windows中的快捷方式&#xff0c;可以让你快速链接到目标档案或目录。 硬链接则透过文件系统的inode来产生新档名&#xff0c;而不是产生…