Linux下HTTP Server

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));  
    }  
  return 0;  
}  
  
//HTTP请求解析   
void serve(int sockfd){  
    char buf[BUF_LEN];  
    read(sockfd, buf, BUF_LEN);  
    if(!strncmp(buf, "GET", 3)){  
        char *file = buf + 4;  
        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, 0);  
    if(sockfd < 0){  
        perror("socket creation failed!\n");  
        return;  
    }  
    memset(&addr, 0, 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, 128);  
    for(;;){  
        //不间断接收HTTP请求并处理,这里使用单线程,在实际情况下考虑到效率一般多线程   
        newfd = accept(sockfd, NULL, NULL);  
        serve(newfd);  
        close(newfd);  
    }  
}  
不到80行代码,就可以实现一个超简单的http服务器了。
转载自:http://blog.csdn.net/ruizeng88/article/details/6682028

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109473.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JAVA项目集锦 Java项目视频20套

    JAVA项目集锦 Java项目视频20套783 127    课程介绍学技术的目的就是为了应用,尤其是的编程开发技术,三天不练手生是大实话同时对于JAVA初学者来说,急需的就是能够参与项目开发,让自己迅速的成长起来,掌握JAVA的核心技术——————-课程目录——————-第01项目:OA办公自动化项目(四套)第02项目:CRM客户关系管理项目(两套)第03项目:宅急送项目第04项目:…

    2022年9月1日
    1
  • python最新激活码2021 4月底【在线注册码/序列号/破解码】

    python最新激活码2021 4月底【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    47
  • 论文笔记:Non-Profiled Deep Learning-based Side-Channel attacks with Sensitivity Analysis(DDLA)

    论文笔记:Non-Profiled Deep Learning-based Side-Channel attacks with Sensitivity Analysis(DDLA)论文笔记:Non-ProfiledDeepLearning-basedSide-ChannelattackswithSensitivityAnalysis(DDLA)BenjaminTimoneShard,SingaporeContribution

    2022年6月14日
    25
  • Linux Vim编辑器的基本使用

    Linux Vim编辑器的基本使用vi、vim编辑器:如何安装vim编辑器?vim编辑器的四种模式及其关系是什么?vim编辑器如何使用?vim如何进行复制、粘贴、剪切、恢复、撤销、删除等操作?vim四种模式如何切换?vim怎么添加多行注释?代码着色、异常退出如何解决、vim各模式的作用是什么…

    2022年7月26日
    5
  • ISP举例_low input lag

    ISP举例_low input lag  从2000年9月底摄像头首次出现在手机上算起,到如今成为诸多智能设备不可或缺的一部分,便携式手机摄像头已经走过了18年的发展历程。随着手机智能化、轻薄化的发展进程,其搭载的摄像头也随之发生了变化,但基本结构并未有太大的改变。通常而言,一个摄像头硬件应包含以下五个部分:外壳(Housing)或者镜头固定物(LensHolder)、镜头(Lens)、红外截止滤波片(IR-cutfilter…

    2022年10月23日
    0
  • getchar用法[通俗易懂]

    getchar用法[通俗易懂]getchar用法1.从缓冲区读走一个字符,相当于清除缓冲区 2.前面的scanf()在读取输入时会在缓冲区中留下一个字符’\n’(输入完s[i]的值后按回车键所致),所以如果不在此加一个getchar()把这个回车符取走的话,gets()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误 3. getchar()是在输入缓冲区顺序读入一个字符(包括空…

    2022年10月19日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号