文档章节

http 简单实现

cicue
 cicue
发布于 2015/12/29 10:16
字数 458
阅读 78
收藏 7

码上生花,ECharts 作品展示赛正式启动!>>>

http 是封装在tcp上的一个数据报文

#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);  
    }  
}


© 著作权归作者所有

cicue
粉丝 16
博文 111
码字总数 75311
作品 0
徐汇
私信 提问
加载中
请先登录后再评论。
golang实现分布式缓存笔记(一)基于http的缓存服务

[toc] 前言 这个月我想学一下go语言,于是决定学习一个go实现的缓存服务。 首先本文基于golang的http包实现一个简单http的缓存服务,因为用golang自带的http包实现一个处理请求的服务端十分便...

osc_o8pkds53
2019/02/15
4
0
中文TTS 的简单实现(基于linux)之 实现原理

实现原理 采用波形拼接的语音生成方法来实现本系统。这种方法预先建立一个庞大的语音数据库,在合成时 采用恰当的技术手段挑选出所需的语音基元进行拼接,从而形成语音输出。因此,语音拼接的...

光石头
2011/04/10
652
0
【白话设计模式一】简单工厂模式(Simple Factory)

白话设计模式 工厂模式 单例模式 【白话设计模式一】简单工厂模式(Simple Factory) 【白话设计模式二】外观模式(Facade) 【白话设计模式三】适配器模式(Adapter) 【白话设计模式四】单例模式...

陶邦仁
2016/01/28
2.7K
5
jQuery LightBox插件原理的简单实现

想必很多人都用过jQuery LightBox插件了吧,今天早上心血来潮想着要简单实现一下LightBox。 PS:很简单的实现,只是想演示一下LightBox的原理,功能也就没那么强大,有意的可以加以改进增强一...

叛道
2012/05/17
1.4K
1
实现一个简单的Retrofit(二)

在上一篇《实现一个简单的Retrofit(一)》中使用 java 的动态代理和注解实现的 Retrofit 的大体框架,可以实现一个基本的 url 的 get请求,如下: 在这篇文章中我们需要实现 Retrofit 的特性...

_番茄沙司
2017/09/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ZOOM International开始以Elevēo品牌开展业务

所有ZOOM Int.产品、销售和服务正在向Elevēo品牌过渡 田纳西州富兰克林和布拉格--(美国商业资讯)--全渠道合规记录、人力资源优化(WFO)和呼叫中心收入保护软件的全球领导者ZOOM Internationa...

osc_vzt0zpwr
25分钟前
20
0
openEuler for arm64(鲲鹏)

设置repo软件源 [base] name=openEuler 20 base baseurl=https://mirrors.huaweicloud.com/openeuler/openEuler-20.03-LTS/OS/aarch64/ enabled=1 gpgcheck=1 gpgkey=https://mirrors.huawei......

chipo
26分钟前
8
0
Mysql 游标的简单使用方法

一、游标简介 1、游标简介 游标是一个存储在MySQL服务器上的数据库查询,它不是一条select语句,而是被该语句检索出来的结果集。有了游标可以方便的对该结果集进行逐行处理。 游标的设计是一...

文文1
26分钟前
10
0
怀里橘猫柴犬,掌上代码江湖——对话阿里云 MVP郭旭东

云栖号资讯:【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 简介: 跟郭旭东聊过之后,我对程序员的敬佩又多一分。这个92年的开发者,难能可贵...

osc_3b0dcpcm
27分钟前
9
0
CMAKE_CURRENT_SOURCE_DIR

CMAKE_CURRENT_SOURCE_DIR CMAKE_CURRENT_SOURCE_DIR 这是当前处理的CMakeLists.txt所在的目录 CMAKE_CURRENT_LIST_DIR (自2.8.3开始)这是当前正在处理的列表文件的目录. 来自Docs: CMAKE_...

osc_cdixgndu
27分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部