Transfer-Encoding: chunked

摘要:
=0){printf("WSAStartupfailed:%d",bytesRecv);return1;}if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){WSACleanup();return1;}strcpy(fname,"index.html");_unlink(fname);charhost[]={"www.baidu.com"};hostent*ht=gethostbyname(host);structin_addrip_addr;memcpy(&ip_addr,ht-˃h_addr_list[0],4);SOCKETsockClient=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_INaddrSrv;addrSrv.sin_addr=ip_addr;addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(80);charip[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:%sip:%s",host,ip);bytesRecv=connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));if(bytesRecv==SOCKET_ERROR){WSACleanup();return1;}charrecvBuf[1024];char*protocolHead="GET/HTTP/1.1""Host:www.baidu.com""Accept:*/*""User-Agent:Mozilla/4.0(compatible;MSIE5.00;Windows98)""Connection:close";bytesRecv=send(sockClient,protocolHead,strlen(protocolHead)+1,0);printf("requestheaders:%s",protocolHead);intic=0;while(bytesRecv!=SOCKET_ERROR){memset(recvBuf,0,1024);bytesRecv=recv(sockClient,recvBuf,1024,0);if(ic==0)printf("responseheaders[%ld]:%s",bytesRecv,recvBuf);if(ic==1)printf("body[%ld]:%s",bytesRecv,recvBuf);ic++;if(bytesRecv==0||bytesRecv==WSAECONNRESET){printf("ConnectionClosed.");break;}logFile(recvBuf,bytesRecv);}closesocket(sockClient);WSACleanup();return0;}voidlogFile(char*p,intlen){FILE*fp=fopen(fname,"a+");if(!
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  

免责声明:文章转载自《Transfer-Encoding: chunked》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇循环使用 v-for 指令。突破SA,,xp_cmdshell恢复终极方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

sqlite3应用

1. 安装sqlite3 sudo apt-get install sqlite3 sudo apt-get install libsqlite3-dev 2. sqlite常用命令 当前目录下建立或打开test.db数据库文件,并进入sqlite命令终端,以sqlite>前缀标识: #sqlite3 test.db 查看数据库文件信息命令(注意命令...

[Linux] 多进程网络编程监听一个端口

SO_REUSEPORT支持多个进程或者线程绑定到同一端口 每个进程可以自己创建socket、bind、listen、accept相同的地址和端口,各自是独立平等的。让多进程监听同一个端口,各个进程中accept socket fd不一样,有新连接建立时,内核只会唤醒一个进程来accept,并且保证唤醒的均衡性 <?php $context=str...

达梦数据库如何将varchar2转换成clob(如何转换数据类型)

达梦数据库和Oracle数据库一样不能修改数据类型,但是可以修改字符类型char可以转varchar2,数值类型int转integer等某些同属数据类型。针对不是同属类型数据类型,我们可以迂回更改。 例如我们修改C1列varchar2为clob 1、建一个新字段C2为clob类型。 alter TABLE T2 add C2 clob; 2、将原来va...

python socket编程介绍

一、概述 socket 通常被称作“套接字”,用于描述IP地址和端口,是通讯链的句柄,应用程序通过socket向网络发送请求或者回应网络的请求。 socket起源于UNIX,在linux、UNIX中“一切皆文件”,对于文件用 打开、读写、关闭 模式来操作。socket就是该模式的一个实现,是一种特殊的文件。一些socket函数就是对其进行的操作(读IO、写...

DB2 日期时间函数

db2日期时间函数 (DATE(TRIM(CHAR(DT#11Y))||'-'||TRIM(CHAR(DT#11M))||'-'||TRIM(CHAR(DT#11D))) BETWEEN DATE('" & strDate1 & "') AND DATE('" & strDate2 & "')) (Y > y) OR...

C字符串和指针问题汇总

空指针和传参问题 1) 段错误。形参改为二级指针即可 void GetMemory( char *p ){   p = (char *) malloc( 100); } void Test( void){ char *str =NULL; GetMemory( str ); strcpy( str, "hello world"); prin...