用c写一个简单的http服务器

| 本文采用的1999年开发者J. David Blackstone写的一个用于学习的http服务器,由于系统的不同,我采用的是修改后适合linux的版本

| Linux改版后的源码地址:https://github.com/qiyeboy/SourceAnalysis

| 图文引用自:https://www.cnblogs.com/qiyeboy/p/6296387.html

| 我的github地址:https://github.com/leilong/tinyhttp_copy

实现原理

源码解析

1,目录分析

http.c 核心文件,请求接收及处理都在这个文件里

Makefile 自动构建脚本

httpd 命令行make后生成的 文件

htdocs 网站运行目录

color.cgi 运行脚本文件

check.cgi

index.html 默认首页

2,http.c文件解读

main 主函数,

start_up 启动服务端(设置http socket,绑定端口,监听连接)

accept 接收客户端连接

pthread_create 启动线程处理新的连接

close 关闭server socket

操作流程

| 注意:由于开发者的系统为Sparc Solaris 2.6,跟我的系统(deepin)有所差别,即使按照文档中给的提示注释掉一些代码依旧无法运行,非常幸运的是找到一个Linux版本的tinyhttp,在此感谢开源工作者的努力。

1,两个cgi文件需要为 700权限

2,index.html权限应该为600

3,执行make

4,输入 ./httpd

5,浏览器地址栏输入 127.0.0.1:40703

举一反三

源文件中,其他人还通过定义一个头部文件让shell脚本能够执行python,那能不能让PHP也能运行呢,翻阅了文档,官方还真的有。

我们在文件里输入,并到浏览器查看,phpinfo信息被展现出来

#!/usr/bin/php

echo phpinfo();

其他实现方式

1,php从5.4.0开始,都有内置的http服务器,可方便开发人员进行本地调试,如果你是tp框架,可在项目根目录下执行 下面这条语句即可。

php -S localhost:8090 -t public ( -t 会指定运行目录 )

2,php还有一种方式实现运行web环境,window下阻塞运行,只可单次连接。

$socket = stream_socket_server("127.0.0.1:8099", $errno, $errstr);

if (!$socket) {

echo "$errstr ($errno)

\n";

} else {

while (true) {

$conn = @stream_socket_accept($socket);

if ($conn) {

echo ('The local time is ' . date('n/j/Y g:i a') . "\n");

} else {

echo "no newSocket\n";

}

}

}

在Linux可增加 pcntl_fork() 进行优化,优化的逻辑是每次连接增加一条新的子进程,但是这样的坏处是用户一多,空置进程增加,运行速度变慢。所以,我们实现的只是一个很简单的http-server,如果需要优化,可增加开发连接线程池,使用epoll模型,开启Gzip等功能。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20190116G195TL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券