利用socket傳檔案

2021-03-31 08:56:59 字數 4704 閱讀 3944

//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程式就不方...