实现超简单的http服务器
想在Linux下实现一个简单的web Server并不难。一个最简单的HTTP Server不过是一个高级的文件服务器,不断地接收客户端(浏览器)发送的HTTP请求,解析请求,处理请求,然后像客户端回送数据。
在大多是情况下,(GET、POST命令),服务求回传给客户端的都是文件(HTML 文档, 图片,javascript脚本等等)。
下面是一个极简单的HTTP Server的demo,虽然只处理GET请求并发送单一文件,但基本展示了web server的框架。
我的例子试图将功能和结构做到最精简,这样,一个http server的基本结构,便一目了然。
#include<sys/socket.h>
#include<errno.h>
#include<netinet/in.h>
#include<string.h>
#include<stdio.h> #define BUF_LEN 1028
#define SERVER_PORT 8080 //定义好的html页面,实际情况下web server基本是从本地文件系统读取html文件
const static char http_error_hdr[] = "HTTP/1.1 404 Not Found\r\nContent-type: text/html\r\n\r\n";
const static char http_html_hdr[] = "HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n";
const static char http_index_html[] =
"<html><head><title>Congrats!</title></head>"
"<body><h1>Welcome to our HTTP server demo!</h1>"
"<p>This is a just small test page.</body></html>"; //解析到HTTP请求的文件后,发送本地文件系统中的文件
//这里,我们处理对index文件的请求,发送我们预定好的html文件
//呵呵,一切从简!
int http_send_file(char *filename, int sockfd)
{
if(!strcmp(filename, "/")){ //通过打印发现确实为”/" ,估计默认请求的是根目录
//通过write函数发送http响应报文;报文包括HTTP响应头和响应内容--HTML文件
write(sockfd, http_html_hdr, strlen(http_html_hdr));
write(sockfd, http_index_html, strlen(http_index_html));
}
else{
// 文件未找到情况下发送404error响应
printf("%s:file not find!\n",filename);
write(sockfd, http_error_hdr, strlen(http_error_hdr));
}
return ;
} //HTTP请求解析
void serve(int sockfd){
char buf[BUF_LEN];
read(sockfd, buf, BUF_LEN);
if(!strncmp(buf, "GET", )){
char *file = buf + ;
char *space = strchr(file, ' ');
*space = '\0';
http_send_file(file, sockfd);
}
else{
//其他HTTP请求处理,如POST,HEAD等 。这里我们只处理GET
printf("unsupported request!\n");
return;
}
} void main(){
int sockfd,err,newfd;
struct sockaddr_in addr;
//建立TCP套接字
sockfd = socket(AF_INET, SOCK_STREAM, );
if(sockfd < ){
perror("socket creation failed!\n");
return;
}
memset(&addr, , sizeof(addr));
addr.sin_family = AF_INET;
//这里要注意,端口号一定要使用htons先转化为网络字节序,否则绑定的实际端口
//可能和你需要的不同
addr.sin_port = htons(SERVER_PORT);
addr.sin_addr.s_addr = INADDR_ANY;
if(bind(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in))){
perror("socket binding failed!\n");
return;
}
listen(sockfd, );
for(;;){
//不间断接收HTTP请求并处理,这里使用单线程,在实际情况下考虑到效率一般多线程
newfd = accept(sockfd, NULL, NULL);
serve(newfd);
close(newfd);
}
}

不到80行代码,就可以实现一个超简单的http服务器了。
http://blog.csdn.net/ruizeng88/article/details/6682028
实现超简单的http服务器的更多相关文章
- Python超简单的HTTP服务器
Python超简单的HTTP服务器 安装了python就可以 python -m SimpleHTTPServer 执行这一个命令即可实现一个HTTP服务器,将当前目录设为HTTP服务目录,可以通过h ...
- python超简单的web服务器
今天无意google时看见,心里突然想说,python做web服务器,用不用这么简单啊,看来是我大惊小怪了. web1.py 1 2 3 #!/usr/bin/python import Simp ...
- Asp.Net读取服务器EXE文件的方法!(超简单实例)
Asp.Net读取服务器EXE文件的方法!(超简单实例) Process process = new Process(); process.StartInfo.FileName = "d:\ ...
- 超简单Mac安装Tomcat服务器
超简单Mac安装Tomcat服务器 1.首先下载tomcat 下载连接 2. 解压并改名 3.把Tomcat复制到系统中的资源库或者Library 4.打开shell,进入Tomcat下面的bin目录 ...
- ServerSocket实现超简单HTTP服务器
1.相关知识简介 HTTP协议 HTTP是常用的应用层协议之一,是面向文本的协议.HTTP报文传输基于TCP协议,TCP协议包含头部与数据部分,而HTTP则是包含在TCP协议的数据部分,如下图 HTT ...
- mysql主从复制(超简单)
mysql主从复制(超简单) 怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: 1.主从服务器分别作以下操作: 1.1.版本一致 1.2.初始化表,并在后台启动mysql ...
- 这些优化 Drupal 网站速度的超简单办法,你忽略了多少?
“怎么样能让我的 Drupal 网站更快一些?”是我们最常遇到的一个问题.站点速度确实非常重要,因为它会影响你的 SEO排名效果.访客是否停留以及你自己管理网站所需要的时间. 今天我们就来看看那些通过 ...
- [转]PHP实现页面静态化的超简单方法
为什么要页面静态化? 1.动态文件执行过程:语法分析-编译-运行 2.静态文件,不需要编译,减少了服务器脚本运行的时间,降低了服务器的响应时间,直接运行,响应速度快:如果页面中一些内容不经常改动,动态 ...
- 响应式编程笔记三:一个简单的HTTP服务器
# 响应式编程笔记三:一个简单的HTTP服务器 本文我们将继续前面的学习,但将更多的注意力放在用例和编写实际能用的代码上面,而非基本的APIs学习. 我们会看到Reactive是一个有用的抽象 - 对 ...
随机推荐
- 一个用beego写的API项目
beego-api 一个使用beego写的API 支持Api日志 支持Swagger注解文档 项目地址: https://github.com/eternity-wdd/beego-api 使用说明 ...
- Maven基本概念——根目录、项目创建、坐标
转载来自:https://www.cnblogs.com/zjfjava/p/6817793.html 尊重原创! (一)Maven 基本概念——根目录.项目创建.坐标 1. MavenProj ...
- Linux常用配置选项
- Mysql(八):ORM框架SQLAlchemy
一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取 ...
- C# 安装WindowsService时弹出设置服务登录窗口的解决方案
使用SignalR实现消息推送,页面实时刷新,使用WindowsService作为SignalR的宿主,也就是作为一个消息服务器,在使用cmd命令安装的时候弹出设置服务登录的窗口,解决此问题的具体操作 ...
- sql从n月到m月数据汇总,没有数据,当月显示0
做个备份 -- 按月份统计select date1, MONTHS, createtime, nvl(count2, 0)+count1 from ( SELECT TO_CHAR(ADD_MONTH ...
- Educational Codeforces Round 40 G. Castle Defense (二分+滑动数组+greedy)
G. Castle Defense time limit per test 1.5 seconds memory limit per test 256 megabytes input standard ...
- MyBatis-07-分页
7.分页 思考:为什么要分页? 减少数据的处理量 7.1.使用Limit分页 select * from user limit startIndex,pageSize 使用Mybatis实现分页,核心 ...
- 《SVG精髓》笔记(一)
本文是基于<SVG精髓>一书的简单总结,文中的demo均为该书提供,目的是方便大家使用时快速查阅. 1. 坐标系统 视口(viewport):文档使用的画布区域,表示SVG可见区域的大小, ...
- 配置Anaconda环境
1. 帮助信息 命令行下执行"conda -h"或“conda --help”可以获得帮助信息: 命令行下执行"conda <argument> -h&quo ...