zoukankan      html  css  js  c++  java
  • Transfer-Encoding: chunked

    Http1.1中 使用 chunked 编码传送时 没有CONTENT_LENGTH,下载之前无法确定要下载的大小. Wininet中已经内嵌该传输协议,要查看chunked块的大小只能socket底层编写获取报文. Wininet能不能直接访问原报文需走旁路.
    // socket_http.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include 
    #include 
    
    #pragma warning(disable:4996)
    #pragma warning(disable:4267)
    #pragma comment(lib, "WS2_32.lib")
    
    void logFile(char *p,int len);
    char fname[100];
    
    int main()
    {
    	WORD wVersionRequested;
    	WSADATA wsaData;
    	int bytesRecv;
    
    	//Initialize Winsock
    	wVersionRequested = MAKEWORD(2,2);
    	bytesRecv = WSAStartup(wVersionRequested,&wsaData);
    
    	if(bytesRecv != 0)
    	{
    		printf("WSAStartup failed: %d
    ", bytesRecv);
    		return 1;
    
    	}
    
    	if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
    	{
    		WSACleanup();
    		return 1;
    	}
    	strcpy(fname,"index.html");
    	_unlink(fname);
    
    	char host[] = {"www.baidu.com"};
    	hostent * ht = gethostbyname(host);
    	struct in_addr ip_addr;
    	memcpy(&ip_addr,ht->h_addr_list[0],4);
    
    	SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);
    	SOCKADDR_IN addrSrv;
    	addrSrv.sin_addr = ip_addr;
    	addrSrv.sin_family = AF_INET;
    	addrSrv.sin_port = htons(80);
    
    	char ip[20];
    	sprintf(ip,"%d.%d.%d.%d",
    		addrSrv.sin_addr.S_un.S_un_b.s_b1,
    		addrSrv.sin_addr.S_un.S_un_b.s_b2,
    		addrSrv.sin_addr.S_un.S_un_b.s_b3,
    		addrSrv.sin_addr.S_un.S_un_b.s_b4);
    	printf("host:%s ip:%s
    ",host,ip);
    
    	bytesRecv = connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
    	if( bytesRecv == SOCKET_ERROR)
    	{
    		WSACleanup();
    		return 1;
    	}
    
    	char recvBuf[1024];
    	char* protocolHead= "GET / HTTP/1.1
    "
    			"Host:www.baidu.com
    "
    			"Accept:*/*
    "
    			"User-Agent:Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)
    "
    			"Connection:close
    
    ";
    
    	bytesRecv = send(sockClient,protocolHead,strlen(protocolHead)+1,0);
    	printf("request headers:
    %s
    ",protocolHead);
    	int ic=0;
    	while( bytesRecv != SOCKET_ERROR )
    	{
    		memset(recvBuf,0,1024);
    		bytesRecv = recv(sockClient,recvBuf,1024,0);
    		if(ic==0)
    			printf("response headers[%ld]:
    %s
    ",bytesRecv,recvBuf);
    		if(ic==1)
    			printf("body [%ld]:
    %s",bytesRecv,recvBuf);
    		ic++;
    		if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) {
    			printf( "Connection Closed.
    ");
    			break;
    		}
    		logFile(recvBuf,bytesRecv);
    	}
    	closesocket(sockClient);
    	WSACleanup();
    
    	return 0;
    }
    
    void logFile(char *p,int len)
    {
    	FILE *fp = fopen(fname,"a+");
    	if(!fp) return;
    	fwrite(p,1,len,fp);
    	fclose(fp);
    }
    
    ----------------------------------------------------------------------
    运行结果
    host:www.baidu.com ip:119.75.218.77
    
    request headers:
    GET / HTTP/1.1
    Host:www.baidu.com
    Accept:*/*
    User-Agent:Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)
    Connection:close
    
    response headers[633]:
    HTTP/1.1 200 OK
    Date: Sun, 13 Apr 2014 18:24:51 GMT
    Content-Type: text/html; charset=utf-8
    Transfer-Encoding: chunked
    Connection: Close
    Vary: Accept-Encoding
    Set-Cookie: BAIDUID=10AA88D7B6D34E65F9FF8A384BE63FE9:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
    Set-Cookie: BDSVRTM=0; path=/
    Set-Cookie: H_PS_PSSID=5778_5991_1421_5225_5848_4760_6017_5856_5918; path=/; domain=.baidu.com
    P3P: CP=" OTI DSP COR IVA OUR IND COM "
    Cache-Control: private
    Expires: Sun, 13 Apr 2014 18:24:20 GMT
    X-Powered-By: HPHP
    Server: BWS/1.1
    BDPAGETYPE: 1
    BDQID: 0x875baba2004f0570
    BDUSERID: 0
    
    body [1024]:
    d27b  <--- chunked 大小
    ^^^^
    以下是html正文
    Connection Closed.
    
  • 相关阅读:
    Sigma Function 数学 因子求和
    luogu P3800 Power收集
    LibreOJ #110. 乘法逆元
    luogu P3802 小魔女帕琪
    LibreOJ #6000. 「网络流 24 题」搭配飞行员
    LibreOJ #103. 子串查找
    LibreOJ #102. 最小费用流
    LibreOJ #109. 并查集
    BZOJ 1922: [Sdoi2010]大陆争霸
    LibreOJ #119. 最短路
  • 原文地址:https://www.cnblogs.com/nlsoft/p/3663109.html
Copyright © 2011-2022 走看看