web服务器实现过程

浏览器通过URL向服务器端发送请求,服务器端分析请求,向客户端浏览器做出回应。

服务器和客户端数据的发送和接收基于HTTP协议,而两边的连接是基于TCP协议。

    先说一下建立连接的过程:服务器端调用socket(),bind(),listen()系统调用后,准备过程完成。再次调用accept()阻塞等待

连接请求的到来。当accept()返回的时候,三次握手完成,连接成功建立。

    socket():调用了socket()函数后,系统会为进程提供一个文件描述符,用来服务器和客户端是中间的数据通信。之后进程

就可以调用write()和read()函数来完成数据的处理。

    bind():使服务器和本地地址以及端口号进行绑定,便于监听请求服务器的连接。调用之前,要将本机ip地址和端口号转化

                为网络字节序。INADDR_ANY表示本机中的所有ip地址。

    listen():使服务器处于监听的状态,将到来的连接请求放入队列。可以指定到来连接的最大值,多余的将会被丢弃掉。

    accept():当该函数成功返回后,连接建立。若此时没有连接的到来,就会阻塞等待连接的到来。

之后再讲一下http协议。

1    浏览器通过URL发送请求。服务器端需要对请求头进行解析。这里只解析了请求头的第一行:GET  /postAuth.html  HTTP/1.1

    其中get:从指定的资源获取数据。/postAuth.html:根目录下的.html文件。http/1.1:http协议版本。总的来说就是客户端想要获取

    根目录下的某个文件。


浏览器每次请求(点击文件,输入url回车)都是一次新的连接请求(因为这里的客户端和服务器进程都将再发送数据后关闭当前连接)

2.发送文件:服务器知道浏览器请求的文件后。要向客户端发送两部分数据:数据头和数据体。数据头主要告知浏览器,服务器的响应状态和文件的类型。数据体就是要发送的数据本身。通过请求头中的.html或者.XX来获得文件类型。通过open()打开文件,mmap()将文件映射到虚拟地址空间,write()先发送数据头再发送数据体。

3.发送目录:主要实现的功能:用户点击目录文件后,服务器要将该目录下的所有文件相关信息返回给浏览器。此时发送给浏览器的数据头中的类型为:“text/html”,即浏览器会以html的形式去解析数据体。通过opendir()打开目录流,readdir()读取每一个目录。这里会用到一个html标签用来返回超链接的功能:<a bref=%s%s> 这里的两个字符串都是要返回的文件名称。而不用自己在把ip地址写入到这里。




猜你喜欢

转载自blog.csdn.net/qq_39846745/article/details/81014080