亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? client.cpp

?? VC++語言中級教材,講授網絡編程中語言的運用技術
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//Http multithread download tools
//by caucy 2006.2.18
#include "stdafx.h"
#include "Client.h"
#include <winsock2.h>
#include <afxsock.h>
#include <assert.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>
#include <time.h>
#include <sys/TIMEB.H>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

using namespace std;

#define BUFFER_BLOCK_SIZE 4096
#define DEAL_SOCK_ERROR(retCode,sock)	if((retCode)==SOCKET_ERROR || (retCode)==0)\
										{										\
											cout<<"Sock error: "<<GetLastError()<<endl;\
											closesocket(sock);					\
											return -1;							\
										}
#define NUM_OF_MAX_THREADS 5
#define HUGE_DATA_SIZE (1024*BUFFER_BLOCK_SIZE)

struct HTTP_Request_Struct
{
	string proxyServerName;
	UINT proxyServerPort;
	string proxyUser;
	string proxyPass;
	string serverHostName;
	UINT serverPort;
	string url;
};
struct HTTP_Thread_Struct
{
	HTTP_Request_Struct request;
	int rangerStart;
	int dutyLength;
};

//Auxiliary Functions
void Date(string& date);
int HttpRequest();
u_long ConvertHostnameToLongHostAddress(const char * destAddress);
void RenameFileName(string& filename);
void GivenUniqueFileName(const string& dir,
					const string& subject,
					string& name,
					string postfix);
void SplitURLToHostAndSubURL(const string& url, string& hostname, string& suburl);
void SplitURLToNameAndPostfix(const string& src, string& name, string& postfix);
void SplitURLToHostAndFilename(const string& url, string& hostname, string& filename);

//Agent Application Functions
int Get(const HTTP_Request_Struct& request, string& filename);

void GetStartString(string& str, string& startStr);
BOOL FilterStartTag(string& str, const string& tag);
BOOL FilterSourceImageURL(string& body, string& url);
void EncodingBase64(const char* src, char* des);

int Socks5StartIPv4(const HTTP_Request_Struct& request,	SOCKET& sock);
int HttpProxyStart(const HTTP_Request_Struct& request,	SOCKET& sock);
DWORD WINAPI DownloadThread(LPVOID p);
int ConnectToServer(const HTTP_Request_Struct& request, SOCKET& sock);


ofstream g_File;
HANDLE g_WriteEvent;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	HttpRequest();
	return 0;
}

int HttpRequest()
{
	string filename;
	HTTP_Request_Struct request;
	request.serverPort=80;
//	request.url="http://10.10.10.80/noclass/InitialD/NI.LabWindows.CVI.v8.0/NI.LabWindows.CVI.v8.0.iso";
	SplitURLToHostAndFilename(request.url, request.serverHostName, filename);
	if(request.url.find("http:/",0)==string::npos)
	{
		request.url=string("http://")+request.url;
	}
	if(filename=="/")
	{
		if(request.url.find_last_of('/',request.url.length())!=request.url.length()-1)
			request.url+="/";
	}
//	request.proxyServerName="";					//Proxy Server IP
//	request.proxyServerPort=808;				//Http Proxy
//	request.proxyServerPort=1080;				//SOCKS Proxy
//	request.proxyUser="";
//	request.proxyPass="";
	
	WSADATA wsaData;
	if(WSAStartup(MAKEWORD( 2, 2 ), &wsaData)!=0)
		cerr<<"socket init error"<<endl;
	
	if(Get(request, filename)==-1)
		cout<<"Unsuccessfully request."<<endl;
	return 0;
}

DWORD WINAPI DownloadThread(LPVOID p)
{
	HTTP_Thread_Struct *pRequest=(HTTP_Thread_Struct*)p;
	int retCode;
	SOCKET sock;
	string str;
	string::size_type pos;
	char buffer[BUFFER_BLOCK_SIZE+1];
	char filter[BUFFER_BLOCK_SIZE+1];
	const int WRITE_BLOCK_SIZE=100*BUFFER_BLOCK_SIZE;
	char *pWriteBuffer;
	string head;
	int contentLength;
	int filepos;
	BOOL bProcessHead=TRUE;
	int tag;

	if(ConnectToServer(pRequest->request,sock)==-1)
		return -1;

	pWriteBuffer= new char[WRITE_BLOCK_SIZE+1];
	//1. GET Command
	contentLength=0;
	filepos=pRequest->rangerStart;
	sprintf(buffer,"GET %s HTTP/1.1\r\nHost: %s\r\nRange: bytes=%d-%d\r\n\r\n",pRequest->request.url.c_str(),pRequest->request.serverHostName.c_str(),pRequest->rangerStart,pRequest->rangerStart+pRequest->dutyLength-1);
	cout<<buffer;
	cout.flush();
	send(sock,buffer,strlen(buffer),0);
	while(1)
	{
		retCode=recv(sock,buffer,BUFFER_BLOCK_SIZE,0);
		if(retCode==0 || retCode==-1)
			goto _exit;

		if(bProcessHead)
		{
			buffer[retCode]='\0';
			cout<<buffer;
			cout.flush();
			head+=buffer;
			if((pos=head.find("\r\n\r\n",0))!=string::npos)
			{
				pos=head.find("\r\n",0);
				strcpy(filter,head.substr(0,pos).c_str());
				if(sscanf(string(filter).c_str(),"%s%d",filter,&tag)==-1 || tag/100!=2)
					goto _exit;
				pos=head.find("\r\n\r\n",0);
				contentLength=pos+4-contentLength;
				//strncpy(pWriteBuffer,buffer+contentLength,retCode-contentLength);
				memcpy(pWriteBuffer,buffer+contentLength,(retCode-contentLength)*sizeof(char));
				contentLength=retCode-contentLength;
				bProcessHead=FALSE;
			}
			else
				contentLength+=retCode;
		}
		else
		{
			//strncpy(pWriteBuffer+contentLength,buffer,retCode);
			memcpy(pWriteBuffer+contentLength,buffer,retCode);
			contentLength+=retCode;
			if(contentLength>=WRITE_BLOCK_SIZE-BUFFER_BLOCK_SIZE || pRequest->dutyLength-contentLength<=0)
			{
				WaitForSingleObject(g_WriteEvent, INFINITE);
				g_File.seekp(filepos);
				pRequest->dutyLength-=contentLength;
				if(pRequest->dutyLength<=0)
				{
					assert(pRequest->dutyLength==0);
					g_File.write(pWriteBuffer,pRequest->dutyLength+contentLength);
					filepos+=contentLength;
					SetEvent(g_WriteEvent);
					goto _exit;
				}
				else
				{
					cout<<".";
					cout.flush();
					g_File.write(pWriteBuffer,contentLength);
					filepos+=contentLength;
					SetEvent(g_WriteEvent);
				}
				contentLength=0;
			}			
		}
	}
_exit:
	closesocket(sock);
	delete[] pWriteBuffer;
	return 0;
}

int Get(const HTTP_Request_Struct& request, string& filename)
{
	int retCode;
	SOCKET sock;
	string::size_type pos;
	char buffer[BUFFER_BLOCK_SIZE+1];
	char filter[BUFFER_BLOCK_SIZE+1];
	string head;
	int contentLength,fileLength;
	int tag;
	ofstream file;
	BOOL bProcessHead=TRUE;
	char *p;
	if(ConnectToServer(request,sock)==-1)
		return -1;
	
	GivenUniqueFileName("",string(filename),filename,"");
	g_File.open(filename.c_str(),ios::binary);
	assert(!g_File.fail());

	//1. GET Command
	sprintf(buffer,"GET %s HTTP/1.1\r\nHost: %s\r\n\r\n",request.url.c_str(),request.serverHostName.c_str());
	cout<<buffer;
	cout.flush();
	send(sock,buffer,strlen(buffer),0);
	contentLength=0;
	while(1)
	{
		retCode=recv(sock,buffer,BUFFER_BLOCK_SIZE,0);
		if(retCode==-1)
		{
			closesocket(sock);
			return -1;
		}
		if(retCode==0)
		{
			cout<<endl<<"File finished!"<<endl;
			g_File.close();
			closesocket(sock);
			return 0;
		}
		if(bProcessHead)
		{
			buffer[retCode]='\0';
			cout<<buffer;
			cout.flush();
			strcpy(filter,buffer);
			_strlwr(filter);
			head+=filter;
			if((pos=head.find("\r\n\r\n",0))!=string::npos)
			{
				pos=head.find("\r\n",0);
				strcpy(filter,head.substr(0,pos).c_str());
				if(sscanf(string(filter).c_str(),"%s%d",filter,&tag)==-1 || tag/100!=2)
				{
					closesocket(sock);
					return -1;
				}
				strcpy(filter,"\r\ncontent-length:");
				if((p=strstr(head.c_str(),filter))!=NULL)
				{
					p+=strlen(filter);
					strcpy(filter,p);
					if(sscanf(filter,"%d",&fileLength)==-1)
					{
						closesocket(sock);
						return -1;
					}
					cout<<"File length: "<<fileLength<<endl;
					cout.flush();
					if(fileLength>2*HUGE_DATA_SIZE)
					{
						cout<<"Multithread downloading is taken...."<<endl;
						cout.flush();
						goto _MT_DOWNLOAD;
					}
					else
					{
						cout<<"Single Thread downloading is taken...."<<endl;
						cout.flush();
						pos=head.find("\r\n\r\n",0);
						contentLength=pos+4-contentLength;
						g_File.write(buffer+contentLength,retCode-contentLength);
						fileLength-=(retCode-contentLength);
					}
				}
				else
				{
					cout<<"Single Thread downloading is taken...."<<endl;
					cout.flush();
					pos=head.find("\r\n\r\n",0);
					contentLength=pos+4-contentLength;
					g_File.write(buffer+contentLength,retCode-contentLength);
					fileLength-=(retCode-contentLength);
				}
				bProcessHead=FALSE;
			}
			else
				contentLength+=retCode;
		}
		else
		{
			cout<<".";
			cout.flush();
			g_File.write(buffer,retCode);
			fileLength-=retCode;
			if(fileLength==0)
			{
				closesocket(sock);
				return 0;
			}
		}
	}
	
	//the first body content is save in buffer and the length is content length
	//3. Filter request return code
_MT_DOWNLOAD:
	closesocket(sock);
	int dutyLength=HUGE_DATA_SIZE;
	int threadNum= fileLength/HUGE_DATA_SIZE;
	if(threadNum>NUM_OF_MAX_THREADS)
	{
		threadNum=NUM_OF_MAX_THREADS;
		dutyLength=fileLength/threadNum;
	}
	g_WriteEvent = CreateEvent(NULL,FALSE,TRUE,NULL);

	HANDLE *pThreadHand= new HANDLE[threadNum];
	HTTP_Thread_Struct *pHttpThreadPara = new HTTP_Thread_Struct[threadNum];
	for(int i=0; i<threadNum-1; i++)
	{
		pHttpThreadPara[i].request=request;
		pHttpThreadPara[i].dutyLength=dutyLength;
		pHttpThreadPara[i].rangerStart=dutyLength*i;
		pThreadHand[i]=CreateThread(NULL,0,DownloadThread,pHttpThreadPara+i,0,NULL);
	}
	pHttpThreadPara[i].request=request;
	pHttpThreadPara[i].rangerStart=dutyLength*i;
	pHttpThreadPara[i].dutyLength=fileLength-pHttpThreadPara[i].rangerStart;
	pThreadHand[i]=CreateThread(NULL,0,DownloadThread,pHttpThreadPara+i,0,NULL);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲影视资源网| 国产天堂亚洲国产碰碰| 日韩精品一区二区三区视频在线观看 | 国产乱一区二区| 波多野结衣欧美| 欧美人与禽zozo性伦| 久久久蜜桃精品| 一区二区三区在线免费观看| 免费在线看一区| 99热这里都是精品| 欧美色图免费看| 国产亚洲精品7777| 亚洲国产日韩一级| 国产传媒一区在线| 欧美日韩激情一区| 国产欧美一区二区三区沐欲| 午夜精品久久久久久久99樱桃| 国产精品系列在线播放| 欧美日韩一区不卡| 国产精品欧美一级免费| 日韩精品福利网| 97精品国产97久久久久久久久久久久 | 国产精品久久看| 日韩影院免费视频| 色婷婷亚洲精品| 久久精品人人做人人综合| 亚洲第一福利一区| 成人黄色小视频在线观看| 日韩欧美久久久| 亚洲制服欧美中文字幕中文字幕| 国产伦理精品不卡| 欧美日本国产视频| 亚洲蜜臀av乱码久久精品| 免费观看在线色综合| 91视频免费看| 久久久久久久久久电影| 美女在线视频一区| 欧洲色大大久久| 亚洲四区在线观看| 国产精品亚洲а∨天堂免在线| 7777精品伊人久久久大香线蕉的| 中文字幕一区三区| 国产精品亚洲综合一区在线观看| 91精品国产综合久久国产大片 | 欧美三级乱人伦电影| 国产精品国产三级国产| 激情图区综合网| 91精品国产综合久久精品麻豆 | 欧美伊人久久久久久午夜久久久久| 中文在线一区二区| 国产一区二区福利| 欧美本精品男人aⅴ天堂| 日本怡春院一区二区| 91首页免费视频| 成人免费小视频| fc2成人免费人成在线观看播放| 国产亚洲美州欧州综合国| 久久er精品视频| 91精品免费观看| 日韩中文字幕麻豆| 91精品免费观看| 日韩高清不卡一区二区| 91精品国产综合久久久久| 日韩在线a电影| 欧美一卡二卡在线观看| 日本在线观看不卡视频| 91麻豆精品久久久久蜜臀 | 日韩一区二区免费在线电影 | 56国语精品自产拍在线观看| 亚洲国产aⅴ成人精品无吗| 一本一道久久a久久精品综合蜜臀| 综合色天天鬼久久鬼色| 91影院在线免费观看| 日韩美女久久久| 色94色欧美sute亚洲线路二| 一区二区三区色| 欧美午夜免费电影| 亚洲成av人片| 91精品国产综合久久精品app| 免费在线观看一区| 久久一日本道色综合| 高清成人在线观看| 日韩毛片高清在线播放| 色中色一区二区| 亚洲国产日韩精品| 日韩欧美www| 国产成人在线视频播放| 亚洲特级片在线| 欧美日韩一区视频| 蜜臀久久久久久久| 久久久久久久久免费| av在线不卡电影| 亚洲香肠在线观看| 日韩一区二区不卡| 国产91露脸合集magnet| 亚洲人成小说网站色在线 | 日本一不卡视频| 精品理论电影在线| 成人丝袜视频网| 亚洲精品免费播放| 日韩午夜激情电影| 国产成人在线免费| 夜夜夜精品看看| 欧美一区二区三区四区高清| 国产成人精品综合在线观看| 尤物在线观看一区| 制服丝袜中文字幕一区| 国产毛片精品一区| 中文字幕一区二区三区蜜月| 欧美视频一二三区| 国内精品写真在线观看| 最新中文字幕一区二区三区| 欧美日韩色综合| 国产一本一道久久香蕉| 亚洲综合在线五月| 日韩三级在线免费观看| 成人丝袜18视频在线观看| 亚洲不卡av一区二区三区| 久久久久久亚洲综合| 在线观看视频一区二区| 国产美女精品在线| 亚洲成人综合在线| 国产精品丝袜一区| 欧美日韩国产成人在线免费| 国产成人啪免费观看软件| 亚洲网友自拍偷拍| 亚洲a一区二区| 国产无遮挡一区二区三区毛片日本| 欧美在线免费观看亚洲| 国产精品一区二区久久精品爱涩| 亚洲福利电影网| 国产日本一区二区| 在线电影欧美成精品| 91在线精品一区二区三区| 久久国产人妖系列| 亚洲va韩国va欧美va| 国产精品久久影院| 精品国产一区二区三区忘忧草| 91久久精品网| 成人av高清在线| 国产一区二区主播在线| 午夜精品久久久久| 亚洲欧洲综合另类| 中文字幕 久热精品 视频在线| 日韩女优视频免费观看| 欧美色手机在线观看| 99久久99久久久精品齐齐| 国产一二精品视频| 麻豆精品一区二区三区| 亚洲国产综合色| 综合亚洲深深色噜噜狠狠网站| xfplay精品久久| 678五月天丁香亚洲综合网| 91国产丝袜在线播放| 处破女av一区二区| 国产黄色成人av| 免费久久99精品国产| 亚洲成人免费视频| 亚洲自拍偷拍综合| 亚洲人午夜精品天堂一二香蕉| 久久久精品一品道一区| 精品福利一区二区三区| 欧美一区二区女人| 欧美巨大另类极品videosbest| 欧美午夜一区二区三区免费大片| 99在线热播精品免费| 成人黄色片在线观看| 成人在线视频一区| 国产盗摄女厕一区二区三区| 国产毛片精品视频| 国产一区二区三区国产| 国内外成人在线视频| 国产一区二区三区久久悠悠色av| 久久国内精品视频| 精品在线一区二区三区| 麻豆freexxxx性91精品| 麻豆高清免费国产一区| 久久国产乱子精品免费女| 另类综合日韩欧美亚洲| 老司机精品视频导航| 免费在线观看精品| 久久99精品国产91久久来源| 国内欧美视频一区二区| 国产精品中文欧美| 成人综合婷婷国产精品久久蜜臀| 国产电影一区在线| av电影在线观看一区| 91视视频在线观看入口直接观看www| 99久久免费国产| 在线观看国产日韩| 欧美精品久久久久久久久老牛影院| 555www色欧美视频| 日韩欧美国产一区二区在线播放| 日韩一级黄色大片| 久久综合色天天久久综合图片| 久久精品夜色噜噜亚洲aⅴ| 国产精品久久午夜| 一区二区在线观看视频| 舔着乳尖日韩一区| 国产真实精品久久二三区|