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

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

?? cdownload.cpp

?? 一個簡單的視頻會議VC++MFC工程文件
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// cdownload.cpp: implementation of the cdownload class.
//
//////////////////////////////////////////////////////////////////////
//*************************************************************
//作者:趙明
//EMAIL:zmpapaya@hotmail.com;papaya_zm@sina.com
//主頁:http://h2osky.126.com
/********************************************************/
#include "stdafx.h"
#include "client1.h"
#include "cdownload.h"
#include "MainFrm.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#define SERVER_PORT 3962
#define SIZE_OF_zmfile 1080//關于此宏的定義,見server1項目。
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

//參數是:“可下載文件列表”List控件中當前列表項的索引。
cdownload::cdownload(int thno1)
{
	m_fname="zm.zip";
	m_index=-1;

	doinfo.totle=0;
	doinfo.threadno=thno1;
}

cdownload::~cdownload()
{

}

//在開始傳送之前,向服務器發出“獲得可下載文件列表”的命令,以便讓客戶端知道有哪些文件可下載。 
//經過我的搜索,我發現,原來這個函數是個作廢了的東西,根本就沒用到呀?!!!
int cdownload::sendrequest(int n)
{
	//獲取服務器信息
	sockaddr_in local;
	//建套接字
	SOCKET m_socket;
	int rc=0;
	//初使化服務器地址
	local.sin_family=AF_INET;
	local.sin_port=htons(SERVER_PORT);
	local.sin_addr.S_un.S_addr=inet_addr(g_csIP);
	//socket函數的第三個參數的默認值是0,表示由程序本身根據地址格式和套接字類型,自動選擇一個合適的協議。
	m_socket=socket(AF_INET,SOCK_STREAM,0);
	int ret;
	//聯接服務器
	ret=connect(m_socket,(LPSOCKADDR)&local,sizeof(local));
	//有錯的話
	if(ret<0)
	{
		AfxMessageBox("聯接錯誤");
		closesocket(m_socket);
		return -1;
	}
	//初使化命令
	fileinfo fileinfo1;
	fileinfo1.len=n;
	fileinfo1.seek=50;
	fileinfo1.type=1;
	//發送命令
	int aa=sendn(m_socket,(char*)&fileinfo1,100);
	if(aa<0)
	{	
		closesocket(m_socket);
		return -1;
	}
	//接收服務器傳來的信息
	aa=readn(m_socket,(char*)&fileinfo1,100);
	if(aa<0)
	{
		closesocket(m_socket);
		return -1;
	}

	//關閉
	shutdown(m_socket,2);
	closesocket(m_socket);
	return 1;
}

//下面是真正執行下載文件操作的函數,是本程序中最最核心的東西了!!!
//參數是:cdownload類的m_index成員的值,用來作為filerange和good數組的下標,還用來作為
//輔助文件的文件名后綴的最后一個字符。
UINT cdownload::threadfunc(long index)
{
	//初使化連接
	sockaddr_in local;
	SOCKET m_socket;
	int rc=0;
	local.sin_family=AF_INET;
	local.sin_port=htons(SERVER_PORT);
	local.sin_addr.S_un.S_addr=inet_addr(g_csIP);
	//socket函數的第三個參數的默認值是0,表示由程序本身根據地址格式和套接字類型,自動選擇
	//一個合適的協議。
	m_socket=socket(AF_INET,SOCK_STREAM,0);
	int ret;
	//創建一個“讀入緩沖區”,大小是20
	char* m_buf=new char[SIZE];
	//remanent中放的是:要下載的這一段文件中,還沒有被下載的字節數,也就是剩余的字節數。
	int remanent,len2;
	fileinfo fileinfo1;
	//連接服務器端。
	ret=connect(m_socket,(LPSOCKADDR)&local,sizeof(local));

	//讀入此線程的下載信息。
	fileinfo1.seek=filerange[index*2];//在文件中seek的位置。

	fileinfo1.len=filerange[index*2+1];//要下載的這一段文件的長度。
	remanent=fileinfo1.len;

	//發給服務器端的信息中,type=2,表示要求下載文件中的一段。(目前,服務器能識別的type的類型只有0和2這兩種)
	fileinfo1.type=2;
	//這個字段,大概是“可下載文件列表”中的索引,可以用作對應的數組的下標。
	fileinfo1.fileno=doinfo.threadno;

	//destination  n.目的地(目標,指定)
	CFile destFile;//用來保存要下載的文件的數據的文件,是“目標文件”。
	FILE* fp=NULL;

	//如果打開m_fname文件失敗,說明此文件并不存在,也就是說:這是第一次下載。
	if((fp=fopen(m_fname,"r"))==NULL)
		//指定了CFile::modeCreate標記,表示一定要創建新文件。
		//調試后發現,m_fname中放的就是要下載的文件的真正的文件名。
		//注意:文件必須要以CFile::shareDenyNone的方式打開,只有這樣,才能實現多個線程同時
		//打開此文件。
		destFile.Open(m_fname, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone);
	//如果此文件已經存在了,則說明這是另一個“正在下載此文件的”線程在運行,或者是續傳。
	else
	{
		//這一句代碼必須要加上,否則,在下載完文件之后,并且客戶端程序沒有退出的情況下,就
		//不能刪除或移動或重命名下載的文件,因為fopen函數打開了文件,如果不關閉文件,則文件
		//就會被鎖定住。
		fclose(fp);//added by yjk 
		destFile.Open(m_fname,CFile::modeWrite | CFile::typeBinary|CFile::shareDenyNone);
	}

	//文件指針移到指定位置,是從文件的開始位置開始偏移的。
	destFile.Seek(filerange[index*2],CFile::begin);
	//發消息給服務器,告訴它“可以傳文件了”。
	sendn(m_socket,(char*)&fileinfo1,100);
	CFile myfile;//這是一個輔助文件,是以“.down+N”為文件名后綴的。
	CString csTemp;
	CString temp;
	temp.Format(".down%d",index);
	//形成了一個輔助下載操作的文件的文件名“XX.down+N”。
	csTemp=m_fname+temp;
	//打開了“XX.down+N”文件
	myfile.Open(csTemp,CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone);
	
	//當還沒下載完這一段文件的時候,就繼續循環
	while(remanent>0)
	{
		//SIZE宏的大小是20,是緩沖區的大小;
		//而remanent中放的是:要下載的這一段文件中,還沒有被下載的字節數。
		len2=remanent>SIZE?SIZE:remanent;
		//從服務器端讀取len2這么多的數據。
		int len1=readn(m_socket,m_buf,len2);
		//如果接收數據的時候發生錯誤,則
		if(len1==SOCKET_ERROR)
		{
			closesocket(m_socket);
			break;
		}
		//將剛剛成功下載下來的這一段數據,寫入到“目標文件”中。
		destFile.Write(m_buf, len1);	

		//更改要下載的這一段文件的長度,減去已經下載下來了的部分。
		filerange[index*2+1]-=len1;
		//前移在文件中seek的位置,也就是把已經下載下來了的那一部分移掉了。
		filerange[index*2]+=len1;
		//移動“文件指針”到輔助文件的開頭位置。
		myfile.Seek(0,CFile::begin);
		//將當前的下載情況寫入到輔助文件中,以備以后實現斷點續傳功能。
		myfile.Write(&filerange[index*2],sizeof(int));
		myfile.Write(&filerange[index*2+1],sizeof(int));
		//減去這次循環所讀取的數據的長度。
		remanent=remanent-len1;
		//totle字段的含義:要被下載的文件段中,已經下載了的字節數。
		//對,下載完了一段之后,就需要把新下載的這一段的字節數加上去。
		doinfo.totle=doinfo.totle+len1;
	};

	//要下載的文件的片段下載完成了,做收尾工作。
	myfile.Close();//關閉輔助文件。
	destFile.Close();//關閉目標文件。
	delete [] m_buf;//刪除用來從服務器端接收數據的緩沖區。
	shutdown(m_socket,2);//關閉連接socket。

	//The shutdown function does not close the socket. Any resources attached to the socket will not be freed until closesocket is invoked.
	closesocket(m_socket);//added by yjk 

	//如果剩余的字節數<=0,則
	if(remanent<=0)
		good[index]=TRUE;//設為true,大概表示:文件的這一段已經被成功下載下來了。
	return 1;
}

//開始下載用戶選中的那個“可下載的文件”。
//參數是:要下載的文件的下標索引。
int cdownload::startask(int n)
{
	//讀入文件長度
	doinfo.filelen=zmfile[n].length;
	//讀入文件名
	m_fname=zmfile[n].name;

	//給主窗體發消息
	CString aaa;
	aaa="正在讀取 "+m_fname+" 信息,馬上開始下載。。。\n";
    AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aaa.GetBuffer(0),1);
	aaa.ReleaseBuffer();

	//如果文件長度小于0,則 返回-1
	if(doinfo.filelen<=0)
		return -1;

	//建一個以.down結尾的文件,用來記錄文件信息
	CString csTemp;
	csTemp=m_fname+".down";
	//保存以.down結尾的文件之名。
	doinfo.name=csTemp;
	FILE* fp=NULL;
	CFile myfile;

	//Run-Time Library Reference  fopen, _wfopen  Open a file.
	//The character string mode specifies the type of access requested for the file, as follows: 
	//"r"  Opens for reading. If the file does not exist or cannot be found, the fopen call fails. 
	//Return Value  Each of these functions returns a pointer to the open file. A null pointer value indicates an error. 
	//如果以r的方式打開XX.down文件失敗,則說明此文件不存在,從而說明這是第一次下載此文件,
	//于是就:初使化對應于各個下載線程的輔助文件。
	if((fp=fopen(csTemp,"r"))==NULL)
	{
		//added by yjk begin
		//看看要下載的文件是否已經存在了,如果是已經存在了,就需要詢問一下用戶,是否要
		//重新下載,如果用戶選擇重新下載,將刪除原來的文件。
		if((fp=fopen(m_fname,"r"))!=NULL)
		{
			fclose(fp);
			//如果用戶不想重新下載,就返回2,終止這次下載操作。
			if(::MessageBox(NULL,"同名的文件已經存在了,如果選擇“是”將覆蓋原來的文件。你是否還要下載此文件?"," YJK 提醒用戶",MB_YESNO|MB_ICONQUESTION)==IDNO)
				return 2;
			//刪除原來的文件,這樣,就跟以前從沒有下載過此文件一樣了。
			DeleteFile(m_fname);
		}
		//added by yjk end

		//這里已經把filerange[0]設定為0了,這表示,數組中的元素的值是從0開始的。
		filerange[0]=0;
		//文件分塊
		//BLOCK的值為4,那么就是從0至3進行循環了。假設文件的長度為203,那么
		//“doinfo.filelen/BLOCK”就等于50了。
		for(int i=0;i<BLOCK;i++)
		{
			if(i>0)
				//當i==1的時候,filerange[2]=50;
				//當i==2的時候,filerange[4]=100;
				//當i==3的時候,filerange[6]=150;
//				filerange[i*2]=i*(doinfo.filelen/BLOCK+1);//加上1,是為了防止程序在遇到doinfo.filelen/BLOCK==0這種情況的時候,運行出錯。
				filerange[i*2]=i*(doinfo.filelen/BLOCK);//added by yjk
			//當i==0的時候,filerange[1]=50;
			//當i==1的時候,filerange[3]=50;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品国产无天堂网2021| 欧美精品tushy高清| 99久久er热在这里只有精品66| 色呦呦国产精品| 欧美精品一区二区三区视频| 一区二区三区四区在线播放| 国产一区二区免费在线| 欧美午夜免费电影| 亚洲最色的网站| 精品亚洲国产成人av制服丝袜| 色婷婷av一区二区三区软件 | 亚洲国产成人av网| 国产一级精品在线| 日韩欧美一级在线播放| 亚洲第一电影网| 色综合咪咪久久| 国产精品拍天天在线| 精品亚洲aⅴ乱码一区二区三区| 欧洲亚洲国产日韩| 国产精品久久久久桃色tv| 国产在线看一区| 91精品国产综合久久久蜜臀粉嫩| 亚洲色图视频免费播放| 国产成人自拍网| 欧美成人女星排名| 日韩av在线发布| 中文字幕日韩一区二区| 蜜桃在线一区二区三区| 欧美午夜一区二区三区| 亚洲一区二区三区自拍| 日本高清无吗v一区| 亚洲欧洲精品天堂一级| 成人高清视频在线观看| 久久久不卡网国产精品二区| 久久成人av少妇免费| 日韩视频国产视频| 天堂成人国产精品一区| 欧美日本国产视频| 亚洲va天堂va国产va久| 欧美剧情电影在线观看完整版免费励志电影| 国产精品国产自产拍在线| 不卡一区二区在线| 最新中文字幕一区二区三区| 99久久精品国产麻豆演员表| 亚洲欧美日韩系列| 在线欧美小视频| 亚洲国产精品一区二区久久恐怖片| 欧亚一区二区三区| 亚洲一区二区三区四区在线免费观看 | 中文字幕免费一区| 成人久久18免费网站麻豆| 国产精品久久二区二区| 91福利社在线观看| 天天色天天操综合| 精品国产一区a| 国产成人av资源| 亚洲精品免费播放| 日韩欧美一区二区不卡| 不卡欧美aaaaa| 亚洲午夜久久久久久久久电影院 | 欧美久久久久久久久久| 国模一区二区三区白浆| 中文字幕一区二区三中文字幕| 欧美这里有精品| 麻豆精品在线播放| 国产精品久久久久影视| 538在线一区二区精品国产| 国产自产v一区二区三区c| 国产精品国产精品国产专区不片| 欧美亚洲高清一区二区三区不卡| 日本特黄久久久高潮| 色中色一区二区| 一区二区三区国产精华| 日韩免费看网站| av一区二区不卡| 亚洲国产视频一区| 国产清纯白嫩初高生在线观看91| 91成人国产精品| 久久精品久久99精品久久| 成人欧美一区二区三区黑人麻豆 | 亚洲一区在线电影| 久久久精品国产免费观看同学| 日本久久一区二区| 国产成人aaa| 丝袜美腿亚洲色图| ●精品国产综合乱码久久久久| 欧美成va人片在线观看| 欧美在线视频你懂得| 国产成人精品一区二区三区四区 | 91精品综合久久久久久| 91丨九色丨尤物| 国产精品99久久久久久宅男| 日本视频在线一区| 一区二区三区免费| 中文字幕中文字幕在线一区| 精品毛片乱码1区2区3区| 欧美片网站yy| 日本高清视频一区二区| 99精品视频在线观看| 国产成人小视频| 国内精品伊人久久久久av一坑| 天天色 色综合| 一区二区三区日韩精品| 亚洲视频一区在线观看| 久久精品一区二区三区不卡牛牛| 欧美嫩在线观看| 欧美视频日韩视频在线观看| 91官网在线观看| 99精品视频免费在线观看| 国产黄色精品视频| 国产成人亚洲精品狼色在线| 国产精品一二二区| 国产a视频精品免费观看| 国产91富婆露脸刺激对白| 国产精品一色哟哟哟| 国产91精品一区二区| 成人午夜又粗又硬又大| 99在线精品免费| 91麻豆福利精品推荐| 91黄色激情网站| 欧美精品aⅴ在线视频| 日韩女优av电影| 久久尤物电影视频在线观看| 久久免费的精品国产v∧| 久久精品人人做人人爽97| 久久久不卡网国产精品二区| 国产精品网友自拍| 一区二区三区在线视频观看| 亚洲一卡二卡三卡四卡五卡| 日韩国产成人精品| 黄色精品一二区| 九九**精品视频免费播放| 激情成人综合网| 国产最新精品免费| 成人91在线观看| 一本大道久久a久久精二百| 99久精品国产| 色婷婷综合久久久中文字幕| 97se亚洲国产综合在线| 欧美在线观看视频一区二区三区| 欧美最猛黑人xxxxx猛交| 国产在线一区二区| 在线亚洲欧美专区二区| 欧美亚洲一区三区| 欧美日韩国产区一| 日韩一级片网址| 国产精品视频观看| 亚洲精品国产无套在线观| 午夜精品成人在线| 精久久久久久久久久久| 91免费版在线| 欧美另类videos死尸| 日韩女优电影在线观看| 欧美高清在线一区二区| 亚洲男同性恋视频| 视频一区二区不卡| 国产一区二区在线观看免费| 成人国产亚洲欧美成人综合网| 欧洲一区在线电影| 精品久久一二三区| 精品成人一区二区| 久久久久久久久一| 日本一区二区三区dvd视频在线| 亚洲免费观看高清| 亚洲成人免费视频| www.在线成人| 欧美日韩一本到| 国产视频911| 中文字幕一区二区三区四区| 久久不见久久见免费视频7| 成人免费毛片a| 欧美日韩专区在线| 久久久久久久综合狠狠综合| 亚洲午夜久久久| 国产福利一区二区| 在线电影欧美成精品| 中文字幕在线一区二区三区| 狠狠色丁香九九婷婷综合五月| 91一区二区三区在线观看| 欧美一级艳片视频免费观看| 欧美国产综合色视频| 国产毛片一区二区| 精品视频一区二区不卡| 国产精品三级电影| 日本欧美大码aⅴ在线播放| 欧美在线制服丝袜| 中文字幕av在线一区二区三区| 日日夜夜免费精品视频| 成人18视频日本| 国产精品欧美久久久久无广告 | 精品一区二区三区久久久| 色天天综合久久久久综合片| 久久久久久久精| 视频在线观看91| 4hu四虎永久在线影院成人| 国产精品不卡一区| 国内精品国产成人| 日韩一区二区三区在线观看| 婷婷丁香激情综合| 色综合久久久久综合体桃花网|