• c++如何使用SOCKET 发送HTTP1.1 GET POST请求包


     

    如何使用SOCKET 发送HTTP1.1 GET POST请求包

    分类: 无线通信 C/C++ 14259人阅读 评论(15) 收藏 举报

    如何使用SOCKET 发送HTTP1.1 GET POST请求包 

    HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。
    请求报文
    一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。
    http 1.1 
     (1)请求行
    请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
    HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。
    GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。
    POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,可用来传送文件。
    (2)请求头部
    请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
    User-Agent:产生请求的浏览器类型。
    Accept:客户端可识别的内容类型列表。
    Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
    (3)空行
    最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
    对于一个完整的http请求来说空行是必须的,否则服务器会认为本次请求的数据尚未完全发送到服务器,处于等待状态。
    (4)请求数据
    请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
    (5)请求示例
    POST:
    POST报文头如下:

    POST /sn/index.php HTTP/1.1
    Accept: */*
    Accept-Language: zh-cn
    host: localhost
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 12
    Connection:close
    sn=123&n=asa
    在http头后边有一空行,空行后边接着发送post数据,长度通过Content-Length: 12
    指出,此post数据中包含两项
    sn=123
    n=asa
    其中:Content-Type: application/x-www-form-urlencoded 指定POST数据的编码类型
    Content-Length: 12 POST数据的长度
    GET:
    GET报问头如下:
    GET /sn/index.php?sn=123&n=asa HTTP/1.1
    Accept: */*
    Accept-Language: zh-cn
    host: localhost
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 12
    Connection:close
    示例代码:
    void MEF_Set_Http_Header(MEF_Http_Action_t method, S8 * action, S8 * server, S8 * msg_body, S8 * head, U8 connect_type)  
    {
            S8 tmp_buf[20];
            const S8 * http_methods_table[MEF_TOTAL_HTTP_ACTIONS] = {"GET", "POST", "HEAD", "PUT", "OPTIONS", "DELETE", "TRACE", "CONNECT"};

            sprintf(head,"%s ", http_methods_table[method]);
            if(action)
            {
                    strcat(head, action);  
            }

            strcat(head," HTTP/1.1");  
            strcat(head,"/r/n");  

            strcat(head,"Accept:*/*");  
            strcat(head,"/r/n");  

            strcat(head,"User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");  
            strcat(head,"/r/n");  

            strcat(head,"Host: ");  
            strcat(head,server);   
            strcat(head,"/r/n");  

            if(method == MEF_HTTP_POST)
            {
                    strcat(head,"Content-Type: application/x-www-form-urlencoded");  
                    strcat(head,"/r/n");  
            }

            if(method == MEF_HTTP_POST)
            {
                    strcat(head, "Content-Length: ");
                    sprintf(tmp_buf, "%d", strlen(msg_body));
                    strcat(head, tmp_buf);
                    strcat(head,"/r/n");  
            }
            if(connect_type == 1)
                    strcat(head,"Connection: Keep-Alive");
            else
                    strcat(head,"Connection: close");
                    
            strcat(head,"/r/n");  
            strcat(head,"/r/n");  
            
            if(method == MEF_HTTP_POST)
            {
                    if(msg_body)
                    {
                            strcat(head,msg_body);  
                    }
            }
    }

  • 相关阅读:
    CF1539 VP 记录
    CF1529 VP 记录
    CF875C National Property 题解
    CF1545 比赛记录
    CF 1550 比赛记录
    CF1539E Game with Cards 题解
    CF1202F You Are Given Some Letters... 题解
    vmware Linux虚拟机挂载共享文件夹
    利用SOLR搭建企业搜索平台 之九(solr的查询语法)
    利用SOLR搭建企业搜索平台 之四(MultiCore)
  • 原文地址:https://www.cnblogs.com/fx2008/p/3682403.html
Copyright © 2020-2023  润新知