Socket傳輸檔案示例

2021-05-12 20:57:15 字數 4619 閱讀 2071

socket傳輸檔案示例

//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;

}

socket 傳輸檔案

在兩台計算機傳輸檔案之前,必需得先有一台計算機建立套節子連線並繫結乙個固定得埠,並在這個埠偵聽另外一台計算機的連線請求。socket new socket addressfamily.internetwork,sockettype.stream,protocoltype.tcp socket.blo...

socket 傳輸檔案

在兩台計算機傳輸檔案之前,必需得先有一台計算機建立套節子連線並繫結乙個固定得埠,並在這個埠偵聽另外一台計算機的連線請求。socket new socket addressfamily.internetwork,sockettype.stream,protocoltype.tcp socket.blo...

socket檔案傳輸

伺服器 本檔案是伺服器的 include for sockaddr in include for socket include for socket include for printf include for exit include for bzero include for time t an...