从sourceforge上下载源码到本地,我在看源码之前喜欢先将程序运行起来看下程序运行的效果,这样对于程序的功能先有一个感性的认识。
下载下来的源码是在Solaris 2.6上编译运行的,在httpd.c中写道:在如果你想要在Linux上运行的话,需要进行一些修改:
1) 注释掉 #include <pthread.h>
2) 注释掉newthread变量的定义
3) 注释掉pthread_create()函数的调用
4) 将accept_request()的调用取消注释
5) 在Makefile中移除-lsocket 修改完之后Server变成了单线程的程序,只能够一个客户端进行连接,所以决定不按照上面的修改,本机的运行环境:OS X。首先将程序make下看看有什么错误。
有四个警告,让我们一一解决掉,首先是:
这个警告的意思就是getsockname函数的第三个参数应该是socklen_t *类型,但是实际传入的参数类型是int *类型,只需要修改下namelen定义的类型修改为socklen_t类型。
这个错误与上面错误类似,也是类型不匹配,将client_name_len定义为socklen_t类型就好了。
这个错误也是参数类型不匹配,pthread_create函数的第三个参数是函数指针类型,这个函数指针应该是void ()(void *)类型,但是定义的accept_request声明为;
void accept_request(int); 所以需要对accept_request进行一些修改,首先将accept_request声明为:
void *accept_request(void *); 因为参数类型和函数返回值都改变了,所以在函数内部需要做些改动,在client使用之前将ptr_client转为client,还有就是需要在最后增加返回语句return NULL;,在中间需要返回的时候也需要返回NULL,修改完的accept_request代码如下:
再将-lsocket
从Makefile
中删去即可。
最后,还有一处错误需要修改:
execl(path, path, NULL); 改为
execl(path, query_string, NULL); 再次运行make,没有警告了,运行可执行文件httpd:./ httpd,显示程序在哪个端口监听,打开浏览器,输入127.0.0.1:<端口号>,页面如图所示: ![](http://7fv9jl.com1.z0.glb.clouddn.com/2015-06-20-run-tinyhttpd-1.png) 在框中输入red或者blue,点击按钮跳转,跳转之后的页面显示为你填写的颜色: ![](http://7fv9jl.com1.z0.glb.clouddn.com/2015-06-20-run-tinyhttpd-2.png) 经过上述的修改tinyhttpd便能在本地运行起来了,接下来对它的源码进行简要的分析。