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...