http简单demo
工作中开发的都是基于B/S(浏览器/服务器)架构项目,很多大牛都在考虑如何设计出高并发的服务器,比如Nginx、Apache,最近在学习这方面底层知识,写一个简单demo。
1 #include <sys/types.h> 2 #include <stdlib.h> 3 #include <stdio.h> 4 #include <sys/un.h> 5 #include <sys/socket.h> 6 #include <string.h> 7 #include <unistd.h> 8 #include <arpa/inet.h> 9 10 int main(){ 11 int server_fd,client_fd; 12 struct sockaddr_in myaddr; 13 struct sockaddr_in clientaddr; 14 int client_len = sizeof(clientaddr); 15 16 //初始化通信地址信息 17 myaddr.sin_family = AF_INET; 18 myaddr.sin_addr.s_addr = htonl(INADDR_ANY); 19 myaddr.sin_port = htons(80); 20 21 //建立一个socket连接 22 server_fd = socket(AF_INET,SOCK_STREAM,0); 23 if(server_fd == -1){ 24 perror("socket error "); 25 } 26 //将地址与socket接口捆绑 27 if(bind(server_fd,(struct sockaddr*)&myaddr,sizeof(myaddr)) == -1){ 28 perror("bind error"); 29 } 30 //创建套接口并监听申请(20个连接)的连接 31 if(listen(server_fd,20) == -1){ 32 perror("listen error"); 33 } 34 35 //发送给客户端的数据 36 char content[] = "<html><h1>hello sundy</h1></html>"; 37 38 39 //循环处理客户端请求 40 while(1){ 41 //接受一个客户端请求 42 client_fd=accept(server_fd,(struct sockaddr *)&clientaddr,&client_len); 43 if(client_fd == -1){ 44 perror("accept error"); 45 } 46 printf("accept\n"); 47 //发送数据到客户端 48 send(client_fd,content,sizeof(content),1); 49 //主动关闭客户端连接 50 close(client_fd); 51 } 52 //关闭套结字连接 53 close(server_fd); 54 printf("hello world!"); 55 return 0; 56 }
一个简单的http服务器,仅仅是学习使用,如果在商业项目中,自己写一个或者基于开源项目修改需要考虑更多(可以参考tengine),比如
1、初始化连接信息,并且创建连接和管理连接;
2、如何解析客户端发过来的数据;
3、如果提供高并发(比如Ngnix的多进程、非堵塞IO、底层数据接口、长连接或者短连接、多个客户请求分发)
4、如果发送数据到客服端;
5、如果处理错误信息并记录详细的日志;
运行环境:Ubuntu 10.04 LTS+VMware8.0.4;