Linux下HTTP Server

来源:互联网 发布:数据分析师是什么 编辑:程序博客网 时间:2024/05/23 01:59

想在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服务器了。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 晚上牙疼得要命怎么办 楼梯被火封锁后怎么办 牙齿疼怎么办能快速不疼 我被短信轰炸了怎么办 火警响了在家该怎么办 痔疮肉球变大了怎么办 痔疮长了好几个怎么办 苹果7手机丢了怎么办 如果油锅着火了怎么办 家里电气著火了怎么办 你家油锅起火了怎么办 交通事故后对方不肯去处理怎么办 租的车出了事故怎么办 借的车出了事故怎么办 台风来了怎么办小知识 台中班台风来了怎么办 地震时在五楼怎么办 小事故对方不来怎么办 发生交通事故对方不处理怎么办 当地震来了该怎么办 地震来了该怎么办教案 地震来了怎么办的问题 住30楼的地震了怎么办 在家里地震来了怎么办? 乐高地震来了怎么办? 地震来了该怎么办300字 地震来了该怎么办200 外地在北京生孩子建档怎么办 怀孕2个月头疼怎么办 怀孕6个月头疼怎么办 轮胎扎了个钉子怎么办 顶菅遇到填土区怎么办 12墙没砌在梁上怎么办 孕32周胎盘二级怎么办 孕36周胎盘三级怎么办 孕24周胎盘一级怎么办 孕24周 胎盘1级怎么办 抗核抗体1:1000怎么办 抗核抗体1:320怎么办 冒险岛2很卡怎么办 短肢剪力墙拆了怎么办