想在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

最新文章

  1. Dungeon Game ——动态规划
  2. ArcSoft&#39;s Office Rearrangement---hdu5933
  3. Hive 12、Hive优化
  4. CEF中文教程(google chrome浏览器控件) -- Windows下编译Chromium
  5. CABasicAnimation 基本动画 分类: ios技术 2015-07-16 17:10 132人阅读 评论(0) 收藏
  6. 配置NFS服务与tftp服务
  7. Mvc分页组件MvcSimplePager代码重构及使用
  8. python的排序方式
  9. Unity iOS Appstore 上架的问题
  10. python __str__() 和 __repr__()是干啥的
  11. firefox(火狐)下 js中设置checkbox属性checked=&quot;checked&quot;已有,但复选框却不显示勾选的原因
  12. __int128
  13. Swarm基于多主机容器网络 - overlay networks 梳理
  14. 【Hive学习之五】Hive 参数&amp;动态分区&amp;分桶
  15. js获取当前时间是本年的第几天第几周
  16. ubuntu 12.04下编译安装nginx-1.9.3
  17. 如何发挥ERP系统中的财务监控职能?
  18. java Class.getSimpleName() 的用法
  19. Ubuntu解压缩zip,tar,tar.gz,tar.bz2
  20. [转]Android Studio开发入门-引用jar及so文件

热门文章

  1. 转: Mac 使用ADT的问题
  2. [AngularJS] $scope.$warchCollection
  3. CSS中:before和:after选择器的用法
  4. 浅谈PHP数据结构之栈
  5. 修复错误配置/etc/fstab文件导致系统无法正常启动
  6. javascript - = 、==、===、!=、!==、&amp;&amp;、||、!
  7. 对hadoop 执行mapreduce时发生异常Illegal partition for的解决过程
  8. JUnit 3.8 让所有测试程序 实现 复合的测试(TestSuite)
  9. sql server Service Broker 相关查询
  10. com.tongyan.tutelage:bdservice_v1