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


相关推荐

  • strictmode android,(十三)Android 性能优化 StrictMode

    strictmode android,(十三)Android 性能优化 StrictMode小酌鸡汤富贵必从勤苦得,男儿须读五车书。StrictMode能检测什么呢?StrictMode主要检测两大问题:线程策略(TreadPolicy)和VM策略(VmPolicy)。StrictMode的工作原理?StrictMode最常用于在应用程序的主线程上捕获意外的磁盘或网络访问,在该线程上接收UI操作并进行动画处理。使磁盘和网络操作脱离主线程可以使应用程序更加流畅,响应更快。通过使应用程序的主…

    2022年6月6日
  • 【C++】自引用this指针的秘密

    【C++】自引用this指针的秘密关于this指针的一个经典回答当我们在进入一个房子之后,可以看见房子里的桌子、椅子、地板等,但是看不到房子的全貌。对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?this是一个指针,它时时刻刻指向这个个实例。识别一个类可以分为哪三步?①识别类名。②识别数据成员。③识别成员函数并修改之。this指针的特性:①this指针的类型:类类型*const。②thi…

    2022年5月16日
  • 【Linux】vim的复制粘贴

    【Linux】vim的复制粘贴vim复制粘贴1.选定文本块。使用v进入可视模式,移动光标键选定内容。2.复制的命令是y,即yank(提起),常用的命令如下:y在使用v模式选定了某一块的时候,复制选定块到缓冲区用;yy复制整行(nyy或者yny,复制n行,n为数字);y^复制当前到行头的内容;y$复制当前到行尾的内容;yw复制一个word(nyw或者ynw,复制n个word,n为数字);yG复制至档尾(nyG或者ynG,复制到第n行,例如1yG或者y1G,复制到档尾)

    2022年9月16日
  • 计算机病毒防治——计算机病毒种类

    计算机病毒防治——计算机病毒种类在介绍病毒种类之前,先来介绍一些常识1、计算机病毒防治要确定安全的度,针对不同的指标设立不同的安全手段,通过以下三个方面来确定度: <1>安全威胁 <2>被保护物品的价值 <3>安全措施所要达到的目标 当攻破防御的成本大于得到数据的收益时,则系统相对来说攻击的人员较少,这时称这个系统是安全的。2、病毒是指是指编制或者在计算机程序中插入的破坏计算机功能或者毁坏数据,影响计算机使用,并且能够自我复制的一组计算机指令或者程序代码。它的根本特点是能够进行自我复制

    2022年6月4日
  • Linux Nginx 负载均衡

    Linux Nginx 负载均衡负载均衡,英文名称为LoadBalance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。软/硬件负载均衡软件负载均…

    2022年6月26日
  • ubuntu修改root密码命令_手机怎么修改wifi密码

    ubuntu修改root密码命令_手机怎么修改wifi密码进入终端,输入sudopasswdroot然后输入当前用户的密码,之后就可以改密码了。需当前用户在sudoersfile里,一般如果是自己电脑的话,就都会在的。

    2022年9月28日

发表回复

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

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