如何點對點實現多執行緒斷點續傳

2021-04-13 23:39:48 字數 4251 閱讀 2282

dword winapi listenthread(lpvoid lpparam)

file://進入迴圈,並接收到來的套接字

while(1)

return 0;

}接著我們來看使用者執行緒:

先看檔案訊息類定義:

struct fileinfo

;file://使用者執行緒函式:

dword winapi clientthread(lpvoid lpparam)

file://把傳來的資訊轉為定義的檔案資訊

fiinfo=(fileinfo*)m_buf;

cstring aaa;

file://檢驗客戶想說什麼

switch(fiinfo->type)

file://發訊息給主函式

aaa="收到list命令/n";

afxgetmainwnd()->sendmessagetodescendants(wm_age1,(lparam)aaa.getbuffer(0),1);

break;

file://我準備好了,可以傳檔案了

case 2:

file://發檔案訊息給主函式

aaa.format("%s  檔案被請求!%s/n",zmfile[fiinfo->fileno].name,nameph[fiinfo->fileno]);

afxgetmainwnd()->sendmessagetodescendants(wm_age1,(lparam)aaa.getbuffer(0),1);

file://讀檔案,並傳送

readfile(pthis,fiinfo->seek,fiinfo->len,fiinfo->fileno);

file://聽不懂你說什麼

default:

aaa="接收協議錯誤!/n";

file://讀檔案函式

void readfile(socket  so,int seek,int len,int fino)

len1=len1-aa;

len=len-aa;

}myfile.close();

int sendrequest(int n);//發檔案資訊

cdownload(int thno1);

virtual ~cdownload();

下面先介紹sendrequest(int n),在開始前,

向伺服器發獲得檔案訊息命令,以便讓客戶端知道有哪些檔案可傳

int cdownload::sendrequest(int n)

file://初使化命令

fileinfo fileinfo1;

fileinfo1.len=n;

fileinfo1.seek=50;

fileinfo1.type=1;

file://傳送命令

int aa=sendn(m_socket,(char*)&fileinfo1,100);

if(aa<0)

file://接收伺服器傳來的資訊

aa=readn(m_socket,(char*)&fileinfo1,100);

if(aa<0) 

file://關閉

shutdown(m_socket,2);

closesocket(m_socket);

return 1;

}介紹開始方法

file://開始方法

int cdownload::startask(int n)

filerange[black*2-1]=doinfo.filelen-filerange[black*2-2];

myfile.open(m_temp,cfile::modecreate|cfile::modewrite | cfile::typebinary);

file://寫入檔案長度

myfile.write(&doinfo.filelen,sizeof(int));

myfile.close();

cstring temp;

for(int ii=0;iitemp.format(".down%d",ii);

m_temp=fname+temp;

myfile.open(m_temp,cfile::modecreate|cfile::modewrite | cfile::typebinary);

file://寫入各程序檔案資訊

myfile.write(&filerange[ii*2],sizeof(int));

myfile.write(&filerange[ii*2+1],sizeof(int));

myfile.close();

}((cmainframe*)::afxgetmainwnd())->m_work.m_listctrl->additemtwo(n,2,0,0,0,doinfo.threadno);

}file://如果檔案已存在,說明是續傳,讀上次資訊

else

if(bb==0)return 1;

doinfo.totle=doinfo.filelen-bb;

((cmainframe*)::afxgetmainwnd())->m_work.m_listctrl->additemtwo(n,2,doinfo.totle,1,0,doinfo.threadno);

return 0;

}file://下面介紹建立各程序函式,很簡單:http://h2osky.126.com

void cmainframe::createthread(int threadno)

file://downthread程序函式

int rc=0;

local.sin_family=af_inet;

local.sin_port=htons(1028);

local.sin_addr.s_un.s_addr=inet_addr(ip);

m_socket=socket(af_inet,sock_stream,0);

file://開啟檔案 

cfile destfile;

file* fp=null;

file://是第一次傳的話

if((fp=fopen(fname,"r"))==null)

destfile.open(fname, cfile::modecreate|cfile::modewrite | cfile::typebinary|cfile::sharedenynone);

else

file://如果檔案存在,是續傳

destfile.open(fname,cfile::modewrite | cfile::typebinary|cfile::sharedenynone);

file://檔案指標移到指定位置

destfile.seek(filerange[index*2],cfile::begin);

file://發訊息給伺服器,可以傳檔案了

sendn(m_socket,(char*)&fileinfo1,100);

cfile myfile;

file://初使化各程序進度資訊http://h2osky.126.com

cstring temp;

temp.format(".down%d",index);

m_temp=fname+temp;

file://當各段長度還不為0時

while(re>0)

file://寫入檔案

destfile.write(m_buf, len1); 

file://更改記錄進度資訊

filerange[index*2+1]-=len1;

filerange[index*2]+=len1;

file://移動記錄檔案指標到頭

myfile.seek(0,cfile::begin);

file://寫入記錄進度

myfile.write(&filerange[index*2],sizeof(int));

myfile.write(&filerange[index*2+1],sizeof(int));

file://減去這次讀的長度

re=re-len1;

file://加檔案長度

doinfo.totle=doinfo.totle+len1;

多執行緒斷點續傳(一)

1 基本ui定義 2 資料庫的操作 3 service的啟動 4 activity給service傳遞引數 5 使用廣播回傳資料到activity 6 執行緒和handler 7 網路操作 檔案的寫入,網路往本地磁碟寫入 1 連線網路檔案 2 獲取檔案長度 3 在本地建立檔案 4 設定檔案長度 第一...

多執行緒斷點續傳(二)

getview 方法會重新呼叫一遍 1 問題 多個執行緒在操作同乙個資料庫,導致資料庫鎖定的問題 資料庫設定為單例模式,保證這個類只有乙個物件,乙個例項。多個例項會產生多個地方去運算元據庫。單例的話,也就是說只有乙個例項會對資料庫進行訪問操作。2 單例設計 永遠只會被例項化一次 a 私有化構造方法 ...

三 多執行緒斷點續傳

conn.setrequestmethod get 獲取檔案總長度,然後建立長度一致的臨時檔案 向伺服器請求部分資料 conn.setrequestproperty range bytes startindex endindex conn.connect if conn.getresponsecod...