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\n", 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\r\n",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\n"
"Host:www.baidu.com\n"
"Accept:*/*\n"
"User-Agent:Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)\n"
"Connection:close\n\n";

bytesRecv = send(sockClient,protocolHead,strlen(protocolHead)+1,0);
printf("request headers:\r\n%s\r\n",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]:\r\n%s\r\n",bytesRecv,recvBuf);
if(ic==1)
printf("body [%ld]:\r\n%s",bytesRecv,recvBuf);
ic++;
if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) {
printf( "Connection Closed.\n");
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

Transfer-Encoding: chunked的更多相关文章

  1. HTTP 2.0的那些事

    转自:http://www.admin10000.com/document/9310.html 在我们所处的互联网世界中,HTTP协议算得上是使用最广泛的网络协议.最近http2.0的诞生使得它再次互 ...

  2. HTTP2.0那些事

    1. HTTP2.0的前世 http2.0的前世是http1.0和http1.1这两兄弟.虽然之前仅仅只有两个版本,但这两个版本所包含的协议规范之庞大,足以让任何一个有经验的工程师为之头疼.http1 ...

  3. Http 1.x弊端与Http 2.0比较

    HTTP2.0作为新版协议,改动细节必然很多,不过对应用开发者和服务提供商来说,影响较大的就几点. 新的二进制格式(Binary Format) http1.x诞生的时候是明文协议,其格式由三部分组成 ...

  4. 再谈HTTP2性能提升之背后原理—HTTP2历史解剖

    即使千辛万苦,还是把网站升级到http2了,遇坑如<phpcms v9站http升级到https加http2遇到到坑>. 因为理论相比于 HTTP 1.x ,在同时兼容 HTTP/1.1 ...

  5. Android 网络请求框架Retrofit

    Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp ...

  6. 也谈HTTP协议

    HTTP(HyperText Transfer Protocol,超文转移协议,超文本传输协议的译法并不严谨.) 一.网络基础 TCP/IP 1.1 TCP/IP 协议族 TCP/IP 协议族是互联网 ...

  7. PLAY2.6-SCALA(七) Streaming HTTP response

    1.从HTTP1.1开始,服务端为了在single connection下对HTTP请求及响应提供服务,需要在response中提供响应的Content-Length. 默认情况下,不需要显示的指明C ...

  8. Python爬虫连载8-JS加密(一)

    一.JS加密 1.有的反爬虫策略采用js对需要传输的数据进行加密处理. 2.经过加密,传输的就是密文 3.加密函数或者过程一定是在浏览器完成,也就是一定会把代码(js代码)暴露给使用者 4.通多阅读加 ...

  9. 分块编码(Transfer-Encoding: chunked)

    参考链接: HTTP 协议中的 Transfer-Encoding 分块传输编码 一.背景: 持续连接的问题:对于非持续连接,浏览器可以通过连接是否关闭来界定请求或响应实体的边界:而对于持续连接,这种 ...

  10. HTTP协议扫盲(八 )响应报文之 Transfer-Encoding=chunked方式

    一.什么是chunked编码? 分块传输编码(Chunked transfer encoding)是只在HTTP协议1.1版本(HTTP/1.1)中提供的一种数据传送机制.以往HTTP的应答中数据是整 ...

随机推荐

  1. js常用插件

    1.jQuery Shortcuts 是个超轻量级的方法,使用 jQuery 来绑定快捷键(热键). 2.Underscore封装了常用的JavaScript对象操作方法,用于提高开发效率. 3.Kn ...

  2. TinyMCE(富文本编辑器)

    [转]TinyMCE(富文本编辑器)在Asp.Net中的使用方法 官网演示以及示例代码:https://www.tinymce.com/docs/demo/image-tools/ 转自:http:/ ...

  3. 【CSU 1556】Pseudoprime numbers

    题 Description Jerry is caught by Tom. He was penned up in one room with a door, which only can be op ...

  4. 【poj2186】 Popular Cows

    http://poj.org/problem?id=2186 (题目链接) 题意 给出一个n个点m条边的有向图,求其中没有出度强连通分量所包含的点有几个 Solution 其实这道题的题解已经在“题意 ...

  5. TCP/IP详解 学习二

    链路层: 在 T C P / I P协议族中,链路层主要有三个目的:(1)为 I P模块发送和接收 I P数据报:( 2)为 A R P模块发送 A R P请求和接收 A R P应答:( 3)为 R ...

  6. 加强版DVD管理系统

    这个加强版,只做了新增和查看. 主要是在新增代码那里增加了一些处理: 进入新增操作,一直可以不跳出来,每次新增成功后,问你是否继续,输入y就继续,输入n就不继续 代码如下: import java.u ...

  7. 轻量级应用开发之(03)UIVIew

    本文是我在学习OC中的一些经验总结,在学习中总结了常用的Mac技巧,欢迎群友对本文提出意见,如有问题请联系我. 一 九宫格-购物车 通过文件加载数据: NSString * file = [[NSBu ...

  8. automapper初步

    首先引入 automapper.dll using System; using System.Collections.Generic; using System.Linq; using System. ...

  9. c# 闭包 小例

    class Program { static void fnnn() { string[] k = new string[] { "x", "y", " ...

  10. Tomcat的目录结构及用途

    目录结构及用途 目录 用途 bin 包含启动/关闭脚本 conf 包含不同的配置文件,包括 server.xml(Tomcat的主要配置文件)和为不同的Tomcat配置的web应用设置缺省值的文件we ...