Linux下HTTP Server
想在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)); } ; } //HTTP请求解析 void serve(int sockfd){ char buf[BUF_LEN]; read(sockfd, buf, BUF_LEN); )){ ; 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, ); ){ 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
Linux下HTTP Server的更多相关文章
- linux下subversion server安装手册
linux下subversion server安装手册 安装基于的Linux版本为:Red Hat Enterprise Linux Server release 6.3. 一 准备需要的安装包. ( ...
- Linux下SVN server 的使用及权限配置
[Linux下SVN server 的使用及权限配置] 参考:http://www.cnblogs.com/heinoc/p/3805779.html
- Linux下SQL Server安装及数据库迁移
有客户使用Linux服务器,SQL Server从2017开始已支持Linux,从未用过,今天测试了一下,比较简单,记录一下. Linux:CentOS 7.0 首先更新源: curl -o /etc ...
- (总结)CentOS Linux下VNC Server远程桌面配置详解
一.安装相应桌面环境与vnc服务端和客户端: # yum groupinstall "GNOME Desktop Environment"(CentOS 5.x安装GNOME桌面环 ...
- CentOS Linux下VNC Server远程桌面配置详解
http://www.ha97.com/4634.html PS:偶以前基本不用Linux的远程图形桌面,前几天有开发的同事配置CentOS的vnc有问题,找我解决,就顺便记录总结一下,这个总结是比较 ...
- VNC CentOS Linux下VNC Server远程桌面配置详解
VNC概述 VNC (Virtual Network Console)是虚拟网络控制台的缩写.VNC 是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的.VNC 是在基于 ...
- linux下IM server搭建
一步一步开始做. 附录: 一套开源协议:http://www.igniterealtime.org/index.jsp Proso:http://prosody.im/ 那谁网友的笔记http://w ...
- Linux下PPPoE Server测试环境搭建
1.1 服务器软件安装 安裝PPPoE Server 所需的软件: 安装ppp模块: sudo apt-get install ppp //一般默认下已安装 安装rp-pppoe,从网络上下载安 ...
- linux下PPTP Server测试环境搭建
1.1 服务器软件安装 安裝PPTP Server 所需的软件: 安装PPTP: sudo apt-get install pptpd PPTP Server的软件安装很简单,只需要安装pptpd ...
随机推荐
- swfupload js中 file 对象的属性
name=3cc68cfc60b87e6dd6887d8a.jpg modificationdate=Wed Apr 21 15:48:30 UTC+0800 2010 filestatus=-1 ...
- 使用百度地图API实现轨迹回放
调用百度地图API实现路线的轨迹回放功能其实很简单,只要搞懂以下几点即可: 1.需要用Polyline方法先绘制好路线图 2.用Marker添加标注点 3.关键一步,通过结合定时器,使用Marker创 ...
- [置顶] 自娱自乐1之Linux UDC驱动(形式模板)
首先,我不是做驱动的开发人员.所以只能用自娱自乐来表示我的行为. 我不知道udc和gadget驱动是不是冷门的驱动,资料真是不多.我之前买了一本书,上面说到这些,就教你如何调试已写好的驱动.这样也可以 ...
- tcp/ip协议中的SYN, ACK的数值变化
还需要论述一下seq.ack表示什么意思,应该以什么样的角度去理解这两个序列号. sequence number:表示的是我方(发送方)这边,这个packet的数据部分的第一位应该在整个data st ...
- es6中的import,export浏览器已经支持
直接上代码, 成功测验了es6的新特性 import , export语法. 服务器返回 js文件时,要加上content-type: applicaiton/javascript 这个字段. ind ...
- dede 怎样调用其它栏目的文章或者缩略图列表且有分页效果?
提问i:我做一个站点.有5个栏目,第5个栏目想把前4个栏目的文章都调用一下,搞一个汇总的文章集合. 发现用arclist调用不能设置pagesize的属性.从而不能给文章分页.然而list貌似不能调用 ...
- Vc++内存布局
Vc++内存布局 测试平台 Windows server 2012 R2 and visual studio 2013 professional. 本篇文章意在介绍vc++中类的内存布局方式,只是研究 ...
- log4j.properties 详解与配置步骤总结
先提供一个项目中使用log4j.properties配置 #log4j.rootLogger=WARN, stdout, file log4j.rootLogger=INFO,console,dail ...
- (剑指Offer)面试题8:旋转数组的最小数字
题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...
- Linux系统攻略 用UUID在Fstab中挂载分区
Fstab 文件大家都很熟悉,Linux 在启动的时候通过 fstab 中的信息挂载各个分区,一个典型的分区条目就像这样: /dev/sdb5 /mnt/usb vfat utf8,umask=0 0 ...