• http协议


    1. 举例

    #include<netinet/in.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
       int sockfd;
       char buffer[1024];
       struct sockaddr_in server_addr;
       int portnumber, nbytes;
       FILE *fp;
       char request[1024];
       int i;
       char *host = "127.0.0.1";
       char *http_req = "GET /%s HTTP/1.1
    Accept: */*
    
    Accept-Language: zh-cn
    
    Accept-Encoding: gzip, deflate
    
    Host: %s:%d
    
    Connection: Close
    
    ";
    
       /* 客户程序开始建立 sockfd描述符 */
       if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) /*建立SOCKET连接*/
       {
          fprintf(stderr, "Socket Error:%sa
    ", strerror(errno));
          exit(1);
       }
    
       /* 客户程序填充服务端的资料 */
       bzero(&server_addr, sizeof(server_addr));
       server_addr.sin_family = AF_INET;
       server_addr.sin_port = htons(80);
       inet_pton(PF_INET, host, &server_addr.sin_addr);
    
       /*连接网站*/
       if(connect(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1) 
       {
          fprintf(stderr, "Connect Error:%sa
    ", strerror(errno));
          exit(1);
       }
    
       /*准备request,将要发送给主机*/
       nbytes = sprintf(request, http_req, "maintlogin.jsp", host, 80);
       printf("%s", request);
    
       /*发送http请求request*/
       if(write(sockfd, request, nbytes) < 0)
       {
          perror("write");
       }
    
       fp = fopen("index.html", "a");
    
       while((nbytes = read(sockfd, buffer, 1)))
       {
          if(i < 4)
          {
             if(buffer[0] == '
    ' || buffer[0] == '
    ')
             {
                i++;
             }
             else
             {
                i = 0;
             }
    
             printf("%c", buffer[0]);/*把http头信息打印在屏幕上*/
          }
          else
          {
             fwrite(buffer, 1, 1, fp);/*将http主体信息写入文件*/
             i++;
    
             if(i % 1024 == 0)
             {
                fflush(fp);   /*每1K时存盘一次*/
             }
          }
       }
    
       fclose(fp);
       close(sockfd);
       return 0;
    }

    2. http_req解释

    //http请求
    GET /maintlogin.jsp HTTP/1.1    //文件要指定/
    Accept: */*     //开头不要有空格
    Accept-Language: zh-cn
    Host: 127.0.0.1:80
    Connection: Close
    
    //请求失败
    HTTP/1.1 400 Bad Request
    Server: Apache-Coyote/1.1
    Date: Tue, 20 Oct 2015 05:23:24 GMT
    Connection: close
    
    //请求成功
    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Content-Type: text/html;charset=UTF-8
    Content-Length: 1297
    Date: Tue, 20 Oct 2015 05:22:36 GMT
    Connection: close

    Server 响应头包含处理请求的原始服务器的软件信息
    Connection:keep-alive TCP连接仍然保持打开状态
    Pragma 页面缓存(1.0)
    cache-control 页面缓存(1.1)
    如果指定压缩,Accept-Encoding: gzip, deflate,主机头会返回压缩提示,Content-Encoding: gzip。相应的Content-Length也会减小

    错误码:见百科

    3. 在tcp/ip协议中的位置
    http协议通常承载于tcp协议之上,有时也承载于TLS或SSL协议层之上,就成了我们常说的https。http端口是80,https端口是443

    http

    4. http消息格式

    消息格式

  • 相关阅读:
    Fiddler显示响应时间
    WPF RichTextBox
    设计模式摘要
    sqlite insert时一直报constraint 约束
    try catch使用规则
    关于WPF的2000件事 06--WPF布局
    SmartAssembly 汉化说明
    GP80系列打印机驱动 V17下载地址
    记录 java 安卓 各类引用包报错处理方法 例如 android.support.v4.app.+ ,io.reactivex.+
    第一讲 新手如何学习HTTP协议之实践项目多开微信机器人
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709889.html
Copyright © 2020-2023  润新知