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

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值