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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Mac安装ElasticSearch介绍

    Mac安装ElasticSearch介绍原文地址:https://segmentfault.com/a/1190000005792528今日项目需要一个小型的搜索的功能的支持,有很多开源的搜索引擎啦,当然Elasticsearch个人认为上手容易,安装也比较方便。ES安装前需要确认你笔记本上已经安装了java,如果没有安装了,可以oracle官网下载就行了,java弄完后,我们可以在命令后工具中输

    2022年6月21日
    121
  • countdown timer plus_Android10使用

    countdown timer plus_Android10使用AndroidCountDownTimer的使用

    2025年12月15日
    6
  • Beta版是什么意思

    Beta版是什么意思

    2021年10月18日
    58
  • PyTorch源码解读之torch.utils.data.DataLoader「建议收藏」

    PyTorch源码解读之torch.utils.data.DataLoader「建议收藏」PyTorch中数据读取的一个重要接口是torch.utils.data.DataLoader,该接口定义在dataloader.py脚本中,只要是用PyTorch来训练模型基本都会用到该接口,该接口主要用来将自定义的数据读取接口的输出或者PyTorch已有的数据读取接口的输入按照batchsize封装成Tensor,后续只需要再包装成Variable即可作为模型的输入,因此该接口有点承上启下的

    2022年6月12日
    42
  • 云游戏、VR、AI,云计算给元宇宙提供了哪些想象力?「建议收藏」

    云游戏、VR、AI,云计算给元宇宙提供了哪些想象力?「建议收藏」2021最火的新概念,莫过于元宇宙。2021年10月29日,Facebook宣布改名Meta;2021年11月1日,“元宇宙第一股”Roblox经过短暂调整,宣布重新上线。接下来关于元宇宙的线下/线上讨论如火如荼,元宇宙概念的热度可见一斑。1.逐层拆解元宇宙清华大学新闻学院教授、博士生导师沈阳教授在一场活动中分享道,元宇宙,英文是Metaverse,从字面来理解,由Meta(超越)和Universe(宇宙)两部分组成。而沈阳教授团队也给元宇宙下了一个相对

    2022年5月30日
    33
  • oraclejobschedulerorcl禁用_oracledbconsoleorcl找不到

    oraclejobschedulerorcl禁用_oracledbconsoleorcl找不到AboutThisdocumentcoversinformationabouttheSBCSetup.ClickheretoexpandTableofContentsIntroductionBelowyou’llfindastepbystepsetupforinstallingFSasaSBC.TheLCRengineisprovide…

    2025年11月1日
    2

发表回复

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

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