http协议及简单的http服务器

URL:统一资源定位符

    urlencode将字符用ASCII码转化显示
    urldecode将ASCII码解码为字符

http基于请求响应

    客户端发起请求,服务端响应请求,然后断开连接

请求协议格式:

    请求行:方法(GET/POST)  URL  HTTP版本(1.1)
    请求报头:name:value(以行为单位)
                     name:value
                     name:value
    空行:\n->\r\n
    正文:(具体数据也可能不存在)

响应协议格式:

    状态行:http版本  状态码  状态码描述
    响应报头:name:value(以行为单位)
                     name:value
                     name:value
    空行:\n->\r\n
    正文: HTML/IMAG/CSS/JS/...

http的方法:

    GET:获取资源
    POST:传输实体主体
    PUT:传输文件
    HEAD:获得报文首部
    。。。

http状态码


1XX 信息性状态码 接收的请求正在处理
2XX 成功状态码 请求正常处理完毕
3XX 重定向状态码 需要进行附加操作以完成请求
4XX 客户端错误状态码 服务器无法处理请求
5XX 服务器错误状态码 服务器处理请求出错

http常见的header

    Content-Type:数据类型
    Content-length: 正文长度
    Host:客户端告诉服务器,资源在哪个端口
    Cookie:用于客户存储少量信息,通常用于实现会话(session)的功能
    。。。

简单的http服务器程序示例

    1 #include <sys/socket.h>
  2 #include <netinet/in.h>
  3 #include <arpa/inet.h>
  4 #include <unistd.h>
  5 #include <string.h>
  6 #include <stdlib.h>
  7 
  8 void Usage()
  9 {
 10     printf("usage: ./server [ip] [port]\n");                                                         
 11 }
 12 
 13 int main(int argc,char* argv[])
 14 {
 15     if(argc!=3)
 16     {
 17         Usage();
 18         return 1;
 19     }
 20 
 21     int fd = socket(AF_INET,SOCK_STREAM,0);
 22 
 23     if(fd<0)
 24     {
 25         perror("socket");
 26         return 2;
 27     }
 28 
 29     struct sockaddr_in addr;
 30     addr.sin_family = AF_INET;
 31     addr.sin_port = htons(atoi(argv[2]));
 32     addr.sin_addr.s_addr = inet_addr(argv[1]);
 33 
 34     int ret = bind(fd,(struct sockaddr*)&addr,sizeof(addr));
 35 
 36     if(ret<0)
 37     {
 38         perror("http");
 39         return 3;
 40     }
 41 
 42     ret = listen(fd,1);
 43 
 44     while(1)
 45     {
 46         struct sockaddr_in client_addr;
 47         
 48         socklen_t len = sizeof(client_addr);
 49 
 50         int client_fd = accept(fd,(struct sockaddr*)&client_addr,&len);
 51 
 52         if(client_fd<0)
 53         {
 54             perror("accept");
 55             continue;
 56         }
 57                                                                                                      
 58         char* input_buf[1024*10] = {0};
 59         ssize_t read_size = read(client_fd,input_buf,sizeof(input_buf)-1);
 60 
 61         if(read_size<0)
 62         {
 63             perror("read");
 64             return 4;
 65         }
 66 
 67         printf("[requset] %s",input_buf);
 68 
 69         char buf[1024]={0};
 70         const char* hello = "<h1>hello world</h1>";
 71 
 72         sprintf(buf,"HTTP/1.0 200 ok\nConnect-Length:%lu\n\n%s,strlen(hello),hello");
 73 
 74         write(client_fd,buf,strlen(buf));
 75     }
 76     return 0;
 77 }                

通过浏览器访问效果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/liuxiaokai_liu/article/details/81045251