点对点多线程断点续传的实现
2010-01-09 20:31:56 来源:WEB开发网读文件函数
void readfile(SOCKET so,int seek,int len,int fino)
{
//文件名
CString myname;
myname.Format("%s",nameph[fino]);
CFile myFile;
//打开文件
myFile.Open(myname, CFile::modeRead | CFile::typeBinary|CFile::shareDenyNone);
//传到指定位置
myFile.Seek (seek,CFile::begin);
char m_buf[SIZE];
int len2;
int len1;
len1=len;
//开始接收,直到发完整个文件
while(len1>0){
len2=len>SIZE?SIZE:len;
myFile.Read(m_buf, len2);
int aa=sendn(so,m_buf,len2);
if(aa<0){
closesocket (so);
break;
}
len1=len1-aa;
len=len-aa;
}
myFile.Close();
}
服务器端最要的功能各技术就是这些,下面介绍客户端。
二、客户端
客户端最重要,也最复杂,它负责线程的管理,进度的记录等工作。
大概流程 如下:
先连接服务器,接着发送命令1(给我文件信息),其中包括文件长度,名字等,然后根 据长度决定分几个线程下载,并初使化下载进程,接着发送命令2(可以给我传文件了),并记录文件进 程。最后,收尾。
这其中有一个十分重要的类,就是cdownload类,定义如下:
class cdownload
{
public:
void createthread();//开线程
DWORD finish1();//完成线程
int sendlist();//发命令1
downinfo doinfo;//文件信息 (与服务器定义一样)
int startask(int n);开始传文件n
long m_index;
BOOL good[BLACK];
int filerange[100];
CString fname;
CString fnametwo;
UINT threadfunc(long index);//下载进程
int sendrequest (int n);//发文件信息
cdownload(int thno1);
virtual ~cdownload();
};
更多精彩
赞助商链接