http简单demo

    工作中开发的都是基于B/S(浏览器/服务器)架构项目,很多大牛都在考虑如何设计出高并发的服务器,比如NginxApache,最近在学习这方面底层知识,写一个简单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

原文地址:https://www.cnblogs.com/sunysen/p/2965554.html