//1:顯示檔案進度
//2:可以隨時終止傳輸過程
//傳送資料執行緒
uint senddatathread(lpvoid lpparam);
//接收資料執行緒
uint receivedatathread(lpvoid lpparam);
//傳送資料按鈕訊息響應函式
void ctzg004dlg::onbuttonsend() }
//接收資料按鈕訊息響應函式
void ctzg004dlg::onbuttonreceive()
//終止傳送按鈕訊息響應
void ctzg004dlg::onbuttonsendend()
//終止接收按鈕訊息響應
void ctzg004dlg::onbuttonrecend()
uint senddatathread(lpvoid lpparam)
csocket socktemp;
cstring str,str1;
socktemp.create(pdlg->m_idataport1); //得到埠號
socktemp.listen(1);//只接受乙個連線
csocket socksend;
//設定傳送按鈕禁止
pdlg->getdlgitem(idc_button_send)->enablewindow(false);
socktemp.accept(socksend);//注意,socktemp已交了自己的指標位址到socksend,故不用close
//開啟傳送終止按鈕
pdlg->getdlgitem(idc_button_send_end)->enablewindow(true);
int ibufsize = 1024 * 5;
int isize = ibufsize;
lpbyte pbuf = new byte[ibufsize];
dword dwtemp = 0;
bool btest = socksend.asyncselect(0);//由於csocket實際是非同步,將它變為同步(阻塞)方式。
socksend.ioctl( fionbio, &dwtemp);//用ioctl要將asyncselect的第乙個引數為0,參看msdn
uint uilength = file.getlength();
socksend.send(&uilength, 4);//傳送檔案大小到接收方(client端)
int inumbyte;
uint uitotal = 0;
while(uitotal < uilength)
else if(iend==1)//傳送端終止
//讀取檔案內容
if((int)(uilength - uitotal) < ibufsize)
isize = uilength - uitotal;//當小於緩衝區itest時的處理
isize=file.read(pbuf , isize);//得到讀取的位元組數
int icount=0;
//傳送定長檔案資料
while(icount
icount+=inumbyte;
if(icount }
uitotal += icount;
//設定傳送資料進度條
pdlg->m_ctrlprogresssend.setpos(int(((double)uitotal/uilength)*100));
str.format("傳送進度:%d%%",int(((double)uitotal/uilength)*100));
//表明傳送資料百分比
pdlg->getdlgitem(idc_static_send)->getwindowtext(str1);
if(str1!=str)
pdlg->getdlgitem(idc_static_send)->setwindowtext(str);
} //傳送檔案成功
afxmessagebox("傳送檔案成功!");
exitlable1:
delete pbuf;
file.close();
socksend.close();
pdlg->m_ctrlprogresssend.setpos(0);//恢復進度
pdlg->getdlgitem(idc_button_send_end)->enablewindow(false);//設定傳送結束按鈕禁止
pdlg->getdlgitem(idc_button_send)->enablewindow(true);//設定傳送按鈕正常
pdlg->getdlgitem(idc_static_send)->setwindowtext("傳送進度:"); //恢復提示進度
return 0;
} uint receivedatathread(lpvoid lpparam)
cstring str,str1,str2;
csocket sockrecv;
sockrecv.create();
pdlg->m_ctrlipsend.getwindowtext(str);//得到傳送端ip位址
pdlg->getdlgitem(idc_button_receive)->enablewindow(false);//禁止接收按鈕
while(sockrecv.connect(str,pdlg->m_idataport2)==0)//連線傳送方位址,若上網,可改為實際ip位址,埠要跟server端相同。
pdlg->getdlgitem(idc_button_rec_end)->enablewindow(true);//開啟終止接收按鈕
str2=dlg.getpathname();//得到檔名
cfile file;
file.open(str2, cfile::modecreate | cfile::modewrite);
bool bfilefail=false;
dword dwtemp = 0;
sockrecv.asyncselect(0);
sockrecv.ioctl( fionbio, &dwtemp);//變為阻塞方式
uint uilength;
sockrecv.receive(&uilength, 4);//接收發方(server端)的檔案大小
int ibufsize = 1024 * 5;
int isize = ibufsize;
lpbyte pbuf = new byte[ibufsize];
int inumbyte;
uint uitotal = 0;
while(uitotal < uilength)
//接收傳送端狀態資料
inumbyte=sockrecv.receive(&iend, sizeof(int));
if(inumbyte == socket_error)
//傳送端終止
if(iend==1)
if((int)(uilength - uitotal) < ibufsize)
isize = uilength - uitotal;
int icount=0;
//讀取定長資料
while(icount
icount+=inumbyte;
file.write(pbuf, inumbyte);
} uitotal += icount;//以實際接收位元組為準
//設定接收進度
pdlg->m_ctrlprogressrec.setpos(int(((double)uitotal/uilength)*100));
str.format("接收進度:%d%%",int(((double)uitotal/uilength)*100));
//顯示接收進度百分比
pdlg->getdlgitem(idc_static_rec)->getwindowtext(str1);
if(str1!=str)
pdlg->getdlgitem(idc_static_rec)->setwindowtext(str);
} //接收檔案成功
afxmessagebox("接收檔案成功!");
bfilefail=true;
exitlable2:
delete pbuf;
file.close();
//檔案接收失敗,則刪除接收檔案
if(!bfilefail)
sockrecv.close();
pdlg->m_ctrlprogressrec.setpos(0);//恢復接收進度
//禁止終止接收按鈕
pdlg->getdlgitem(idc_button_rec_end)->enablewindow(false);
//開啟接收按鈕
pdlg->getdlgitem(idc_button_receive)->enablewindow(true);
//恢復提示進度
pdlg->getdlgitem(idc_static_rec)->setwindowtext("接收進度:");
return 0;
}
php 利用socket上傳檔案
一,利用fsockopen來上傳檔案 以前我寫過一篇關於socket通訊原理的博文有興趣的朋友可以看看,前面講的那篇博文,socket的伺服器和客戶端都是要用php命令來執行的。平常我們上傳檔案是瀏覽本地檔案,通過乙個php程式將檔案上傳乙個地方,這個時候我們用php命令來執行php程式就不方便了。...
php 利用socket上傳檔案
socket通訊原理的博文 socket的伺服器和客戶端都是要用php命令來執行的。平常我們上傳檔案是瀏覽本地檔案,通過乙個php程式將檔案上傳乙個地方,這個時候我們用php命令來執行php程式就不方便了。這個時候我們可以用fsockopen來開啟乙個socket通道,並且可以通過瀏覽器來訪問頁面。...
php 利用socket上傳檔案
一,利用fsockopen來上傳檔案 以前我寫過一篇關於socket通訊原理的博文 有 興趣的朋友可以看看,前面講的那篇博文,socket的伺服器和客戶端都是要用php命令來執行的。平常我們上傳檔案是瀏覽本地檔案,通過乙個php程式 將檔案上傳乙個地方,這個時候我們用php命令來執行php程式就不方...