文件传输 3断点续传与多线程传输

上传人:ni****g 文档编号:507363077 上传时间:2024-02-05 格式:DOC 页数:30 大小:54KB
返回 下载 相关 举报
文件传输 3断点续传与多线程传输_第1页
第1页 / 共30页
文件传输 3断点续传与多线程传输_第2页
第2页 / 共30页
文件传输 3断点续传与多线程传输_第3页
第3页 / 共30页
文件传输 3断点续传与多线程传输_第4页
第4页 / 共30页
文件传输 3断点续传与多线程传输_第5页
第5页 / 共30页
点击查看更多>>
资源描述

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

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

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

3、; /线程开始位置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 Errorn;服务端代码如下while(true)SOCKET client;if(client=accept(server,(sockaddr *)&clientaddr,&len)FILEINFO RecvFileInfo;

4、memset(char*)&RecvFileInfo,0,sizeof(RecvFileInfo);if(recv(client,(char*)&RecvFileInfo,sizeof(RecvFileInfo),0)=SOCKET_ERROR)coutThe Clinet Socket is Closedn;break;elseEnterCriticalSection(&CS); /进入临界区memcpy(char*)&TempFileInfo,(char*)&RecvFileInfo,sizeof(RecvFileInfo);switch(TempFileInfo.CMD)case 1:G

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

6、foProc(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 Errorn;elsecout The Filelen is FileLennn;return 0;复制代码这里主要是向客户端传递文件长度,而客户端收到长度后则开辟线程进行连接传输文件2.客户端跟据长度开辟线

7、程其实现代码如下FILEINFO FI;int FileLen=0;if(recv(client,(char*)&FileLen,sizeof(FileLen),0)=SOCKET_ERROR)/接受文件长度coutRecv FileLen Errorn;elsecoutFileLen is FileLenn;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-=r

8、et;idx+=ret;file.Close();delete date;elsecoutopen the file errorn;closesocket(client);return 0;复制代码还是比较简单的,主要是获取线程的文件长度和偏移,并移动文件指针到偏移处,最后读取发送数据,而客户端接受数据并写入文件.4.客户端将线程数据保存到文件GetFileThread的实现代码如下DWORD WINAPI GetFileThread(LPVOID lparam)char TempNameMAX_PATH;sprintf(TempName,TempFile%d,*(DWORD*)lparam)

9、; /每线程的文件名为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 Errorn;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;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

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