断点续传与多线程传输转.doc

上传人:博****1 文档编号:559827885 上传时间:2023-02-09 格式:DOC 页数:7 大小:40KB
返回 下载 相关 举报
断点续传与多线程传输转.doc_第1页
第1页 / 共7页
断点续传与多线程传输转.doc_第2页
第2页 / 共7页
断点续传与多线程传输转.doc_第3页
第3页 / 共7页
断点续传与多线程传输转.doc_第4页
第4页 / 共7页
断点续传与多线程传输转.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《断点续传与多线程传输转.doc》由会员分享,可在线阅读,更多相关《断点续传与多线程传输转.doc(7页珍藏版)》请在金锄头文库上搜索。

1、c+实现文件传输之三:断点续传与多线程传输转 继木马编程DIY的上两篇,现在我们开始讨论断点续传与多线程文件传输的实现.其实这两项功能是下载软件所必不可少的功能了,现在我们把它加到自己的木马中来感受感受.提到多线程下载,首先向网络蚂蚁的作者洪以容前辈致敬,正是由于网络蚂蚁而使得多线程下载被关注并流行起来.在这本篇文章中我们将简单的实现支持断点续传和多线程传输的程序.为了更清晰的说明问题,我们将断点续传与多线程传输分别用两个程序来实现多线程传输实现实现原理将源文件按长度为分为N块文件,然后开辟N个线程,每个线程传输一块,最后合并所有线线程文件.比如一个文件500M我们按长度可以分5个线程传输.第

2、一线程从0-100M,第二线程从100M-200M.最后合并5个线程文件.实现流程1.客户端向服务端请求文件信息(名称,长度)2.客户端跟据文件长度开辟N个线程连接服务端3.服务端开辟新的线程与客户端通信并传输文件4.客户端将每线程数据保存到一个文件5.合并所有线程文件编码实现大体说来就是按以上步骤进行,详细的实现和一些要点,我们跟据以上流程在编码中实现结构定义在通信过程中需要传递的信息包括文件名称,文件长度,文件偏移,操作指令等信息,为了方便操作我们定义如下结构 代码:typedef struct char Name100; /文件名称 int FileLen; /文件长度 int CMD;

3、 /操作指令 int seek; /线程开始位置 SOCKET sockid; FILEINFO;1.请求文件信息客户端代码如下 代码: FILEINFO fi; memset(char*)&fi,0,sizeof(fi); fi.CMD=1; /得到文件信息 if(send(client,(char*)&fi,sizeof(fi),0)=SOCKET_ERROR) coutSend Get FileInfo Error/n; 服务端代码如下 while(true) SOCKET client; if(client=accept(server,(sockaddr *)&clientaddr,&

4、len) FILEINFO RecvFileInfo; memset(char*)&RecvFileInfo,0,sizeof(RecvFileInfo); if(recv(client,(char*)&RecvFileInfo,sizeof(RecvFileInfo),0)=SOCKET_ERROR) coutThe Clinet Socket is Closed/n; break; else EnterCriticalSection(&CS); /进入临界区 memcpy(char*)&TempFileInfo,(char*)&RecvFileInfo,sizeof(RecvFileInf

5、o); switch(TempFileInfo.CMD) case 1: GetInfoProc (client); break; case 2: TempFileInfo.sockid=client; CreateThread(NULL,NULL,GetFileProc,NULL,NULL,NULL); break; LeaveCriticalSection(&CS); /离开临界区 在这里服务端循环接受连接,并跟据TempFileInfo.CMD来判断客户端的请求类型,1为请求文件信息,2为下载文件因为在下载文件的请求中,需要开辟新的线程,并传递文件偏移和文件大小等信息,所以需要对线程同步

6、.这里使用临界区其文件信息函数GetInfoProc代码如下 代码:DWORD GetInfoProc(SOCKET client) CFile file; if(file.Open(FileName,CFile:modeRead|CFile:typeBinary) int FileLen=file.GetLength(); if(send(client,(char*)&FileLen,sizeof(FileLen),0)=SOCKET_ERROR) cout Send FileLen Error/n; else cout The Filelen is FileLen/n/n; return

7、0;这里主要是向客户端传递文件长度,而客户端收到长度后则开辟线程进行连接传输文件2.客户端跟据长度开辟线程其实现代码如下 代码: FILEINFO FI; int FileLen=0; if(recv(client,(char*)&FileLen,sizeof(FileLen),0)=SOCKET_ERROR)/接受文件长度 coutRecv FileLen Error/n; else coutFileLen is FileLen/n; int COUNT_SIZE=FileLen/5; /每线程传输大小 for(int i=0;i5;i+) /分5个线程传输 EnterCriticalSec

8、tion(&CS); /进入临界区 memset(char*)&FI,0,sizeof(FI); FI.CMD=2; /请求下载文件 FI.seek=i*COUNT_SIZE; /线程文件偏移 if(i+1=5) /最后一线程长度为总长度减前4个线程长度 FI.FileLen=FileLen-COUNT_SIZE*i; else FI.FileLen=COUNT_SIZE; Thread=CreateThread(NULL,NULL,GetFileThread,&i,NULL,NULL); Sleep(500); LeaveCriticalSection(&CS); /离开临界区 WaitForMultipleObjects(5,Thread,true,INFINITE); /等所有线程结束这里默认开辟5个线程传输,当然可以改为想要的线程数目,仍然用临界区来实现线程的同步问题3.服务端开辟线程传输数据在1.请求文件信息中以说明了服务端的结构,这里主要介绍线程函数的实现,其代码如下 代码:DWORD WINAPI GetFileProc(LPVOID lparam) EnterCriticalSection(&CS); /

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号