一个简单HTTP服务器程序在Linux下的C实现. 联系客服

发布时间 : 星期一 文章一个简单HTTP服务器程序在Linux下的C实现.更新完毕开始阅读86e5bc635b8102d276a20029bd64783e09127d82

一个简单HTTP服务器程序在Linux下的C实现 曹玮(3004204123天津大学计算机学院04级5班 1.实验目的:

?了解套接字(socket实现原理,阅读Linux或者FreeBSD网络部分的源程序。 ?在某一种平台(Linux,Unix系列或Windows系列下进行网络客户机-服务器编程。

2.程序要求:

编写一个多线程服务器程序,主线程通过非80端口监听连接请求,要求server能够显示客户端请求消息的内容,如果遇到错误,server能够区分几种基本错误类型,并回应客户端相应错误信息,客户端可以用浏览器或者自己编程实现。

要求用C/C++ 实现。 3.程序简介:

本程序(MyServer v0.0.1是一个在Linux RedHat 9 下开发的命令行模式程序。启动后通过配置,可监听大于1024的任意指定端口,如有浏览器或其他程序对该端口发出http 的GET请求,则程序产生子进程通过TCP套接字向请求方发送所需文件,而主程序继续监听。当程序截获到用户发出的SIGINT信号后,程序向屏幕打出退出信息,然后自动退出。(在程序运行于前台时,可用ctrl + c; 后台运行时,可以先通过ps –ef 命令查看进程的PID,进而用kill命令将其结束。

本程序支持传送HTML以及HTM形式的文档,以及JPEG和GIF格式的图片。在发送这些消息之前,会加上头信息。当遇到错误请求时,会给出应答(如404号错误。

本程序的结构采用了模块形式,降低了程序的耦合性,易于维护。并且有比较好的可读性。

缺点和一些有待改进的地方:主要表现在由于是在Linux环境下编写的纯C语言程序,因而缺少一个图形用户前端,这使得操作程序比较繁琐。另一点是目前程序支持的文件格式还比较少(这是因为在程序中加了一定限制,在传输图片时,由于需要在发送前预知其大小,因而采用了将文件整体读入内存的方式,这种方式使得在处理比较大的数据时(比如大的图片,会不能成功传送。这都是亟待改进的地方。

4.程序原理及主要技术

这里想说的主要是多线程相应请求的技术。

在Unix/Linux 环境下,实现多线程同步有很多方式,本程序采用了最简单也最容易理解的形式,即用fork(系统调用。首先在主进程里创建套接字,并监听相应端口是否有请求,一旦发现请求,则立即用fork 产生一个子进程,用来相应请求;主进程则继续监听。子进程完成发送后即退出结束。整个过程就变得十分清晰了。由于linux 在处理fork 的进程是采用复制资源的方式,因而套接字的共享就比较简单的得以实现了。

再有就是通过配置文件保存用户对端口号和主目录的配置信息。这个以隐藏文件出现的文件在安装程序时生成,就在默认安装路径/usr/local/bin 下。它保存了上一次用户通过-c 选项配置的主目录和端口号。默认情况下,端口号为8080,主目录是运行程序的当前目录(也就是说将网页文件放在这个目录下。

5.程序流程图: 程序开始运行 并接受命令行参数 输入命令行参数是否运行?

运行程序,创建Socket 监听

配置或帮助是否有请求? 不是 没有请求 子进程负 责发送数 据父进程返回 Fork(

收到SIGINT 信 号,结束程序 发送完成后结 束进程 收到 SIGINT 信号 是是

6.主要函数及功能: 请参看代码注释。

7.其他说明:

[1].本程序在Linux Redhat 9 下编译运行成功,测试浏览器为Mozilla浏览器。 程序的二进制代码附在压缩包中,但由于Linux个发行版之间可能存在 兼容性问题,因此建议在测试时,安装压缩包中提供的tar 包,具体方法 见readme.html。

[2].本程序的源代码及注释和makefile文件都在包中,其中有比较详尽的英 文注释。

[3].如在测试中遇到问题,请致信amalcaowei@gmail.com。