深入理解计算机系统:网络编程 下 一个简单的web服务器

编写一个web服务器的基础是熟悉套接字接口。笔者因为还没有对其进行实践,只对其有一些粗浅的了解。本文重点记录一个web服务的核心功能主要由哪几部分组成。
1. main函数

之前写到,从客户端到服务器的连接是主动的,服务器是在被动地等待一个客户端对其发起连接请求,然后建立连接。所以,我们的服务器的main程序的核心功能就是有一个while循环,等待客户端发起连接请求,然后接受请求,处理事务(diot),关闭连接它的另一端。
2. diot

首先,需要对客户端发起请求的报头进行分析。例如分析客户端发起的是GET还是POST请求。等等。如果服务器不支持该请求方法,那就返回错误,关闭连接,等待下一个请求。如果服务器支持该方法,就分析CGI参数字符串(表明这是一个动态请求),并设定标志位。最后,如果请求的是静态内容,就向客户端提供静态内容;如果请求的是动态内容,就调用动态程序,返回动态内容。
3. serve_static

提供静态内容,需要根据请求的URI确定访问的文件名,然后根据文件名后缀判断请求的文件类型。并发送响应报头和响应主体给客户端。响应主体就是通过读取静态文件,然后将文件描述符映射到存储器,然后拷贝这个文件中的所有字节,来进行获取的。
4. serve_dynamic

提供动态内容,需要派生一个子进程,并在子进程的上下文中运行一个CGI程序,来提供各种类型的动态内容。子进程通过请求URI获取的CGI参数初始化QUERY——STRING环境变量。然后子进程重定向它的标准输出到已连接文件描述符,然后加载并运行CGI程序。CGI运行的结果会直接显示在服务器端。
总结

以上就是一个web服务器的基本功能中的核心功能,其它的还有错误处理,参数分析等等,这里并没有涉及。如果感兴趣可以阅读这本书的第11章。
正如贯穿这本书的核心思想之一:对于主机来讲,网络也是一个I/O设备。只不过可能读取的文件在网络上的某个别的机器上,但本质就是一种I/O。
希望这篇简短的记录能够让对网络世界好奇的你有所帮助~路漫漫其修远兮,吾将上下而求索。

猜你喜欢

转载自blog.csdn.net/ctrigger/article/details/89393153
今日推荐