




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
c+实现文件传输之三:断点续传与多线程传输转 继木马编程DIY的上两篇,现在我们开始讨论断点续传与多线程文件传输的实现.其实这两项功能是下载软件所必不可少的功能了,现在我们把它加到自己的木马中来感受感受.提到多线程下载,首先向网络蚂蚁的作者洪以容前辈致敬,正是由于网络蚂蚁而使得多线程下载被关注并流行起来.在这本篇文章中我们将简单的实现支持断点续传和多线程传输的程序.为了更清晰的说明问题,我们将断点续传与多线程传输分别用两个程序来实现多线程传输实现实现原理将源文件按长度为分为N块文件,然后开辟N个线程,每个线程传输一块,最后合并所有线线程文件.比如一个文件500M我们按长度可以分5个线程传输.第一线程从0-100M,第二线程从100M-200M.最后合并5个线程文件.实现流程1.客户端向服务端请求文件信息(名称,长度)2.客户端跟据文件长度开辟N个线程连接服务端3.服务端开辟新的线程与客户端通信并传输文件4.客户端将每线程数据保存到一个文件5.合并所有线程文件编码实现大体说来就是按以上步骤进行,详细的实现和一些要点,我们跟据以上流程在编码中实现结构定义在通信过程中需要传递的信息包括文件名称,文件长度,文件偏移,操作指令等信息,为了方便操作我们定义如下结构 代码:typedef struct char Name100; /文件名称 int FileLen; /文件长度 int CMD; /操作指令 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,&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(RecvFileInfo); 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为下载文件因为在下载文件的请求中,需要开辟新的线程,并传递文件偏移和文件大小等信息,所以需要对线程同步.这里使用临界区其文件信息函数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 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;i0) int ret=send(client,&dateidx,nLeft,0); if(ret=SOCKET_ERROR) coutSend Date Error /n; break; nLeft-=ret; idx+=ret; file.Close(); delete date; else coutopen the file error/n; closesocket(client); return 0;还是比较简单的,主要是获取线程的文件长度和偏移,并移动文件指针到偏移处,最后读取发送数据,而客户端接受数据并写入文件.4.客户端将线程数据保存到文件GetFileThread的实现代码如下 代码:DWORD WINAPI GetFileThread(LPVOID lparam) char TempNameMAX_PATH; sprintf(TempName,TempFile%d,*(DWORD*)lparam); /每线程的文件名为TempName+线程数 SOCKET client; SOCKADDR_IN serveraddr; int port=5555; client=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); serveraddr.sin_family=AF_INET; serveraddr.sin_port=htons(port); serveraddr.sin_addr.S_un.S_addr=inet_addr(127.0.0.1); if(connect(client,(SOCKADDR*)&serveraddr,sizeof(serveraddr)=INVALID_SOCKET) coutConnect Server Error/n; EnterCriticalSection(&CS); /进入临界区 if(send(client,(char*)&FI,sizeof(FI),0)=SOCKET_ERROR) cout0) int ret=recv(client,&dateidx,nLeft,0); if(ret=SOCKET_ERROR) coutRecv Date Error; break; idx+=ret; nLeft-=ret; file.Write(date,FileLen); file.Close(); delete date; else coutCreate File Error/n; return 0;在此线程函数中,将每线程传输的数据存为一个文件,文件名为TempName+线程数,只所以存成单独的文件是因为比较直观且容易理解,但如果文件很大的话这个方法并不好,因为合并文件又会花费很多时间,另一个方法是 创始一个文件,让每个线程写入文件的不同偏移,这样就可以不必单独合并文件了,但要记得打开文件时加入CFile:shareDenyNone属性.这样整个过程就完成了.最后一步合并线程文件5.合并线程文件 代码:int UniteFile() /合并线程文件 coutNow is Unite Fileing./n; int len; char *date; CFile file; CFile file0; /*其它文件.*/ if(file.Open(FileName,CFile:modeCreate|CFile:typeBinary|CFile:modeWrite)/创建文件 file0.Open(TempFile0,CFile:modeRead|CFile:typeBinary);/合并第一线程文件 len=file0.GetLength(); date=new charlen; file0.Read(date,len); file.SeekToEnd(); file.Write(date,len); file1.Open(TempFile1,CFile:modeRead|CFile:typeBinary);/合并第二线程文件 len=file1.GetLength(); date=new charlen; file1.Read(da
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025拉萨公务员面试题及答案
- 维修机井施工方案(3篇)
- 桥墩加固施工方案(3篇)
- 吊车专项施工方案(3篇)
- 金华单位活动策划方案模板(3篇)
- 地块配备租赁合同范本
- 社团策划活动方案线上模板(3篇)
- 道路电缆施工方案(3篇)
- 内江高三一模文科数学试卷
- 政府灯笼采购合同范本
- GB/T 20671.7-2006非金属垫片材料分类体系及试验方法第7部分:非金属垫片材料拉伸强度试验方法
- GB/T 10781.1-2006浓香型白酒
- 冀教版六年级英语上册课件Unit-2
- 轴孔用YX型密封圈规格尺寸
- 肾上腺疾病外科治疗
- 第9章探放水钻机及相关设备的安全使用.
- 水调歌头·游泳-课件
- 人教版三年级下册体育与健康教案(全册教学设计)
- 交通部农村公路建设标准指导意见
- 卫浴店面管理
- 清表施工方案4常用
评论
0/150
提交评论