.
{ KillTimer(1);
m_bIsWait=FALSE; //等待状态清空 //启动发送文件线程
GetDlgItem(IDC_SR)->SetWindowText(\已发送:\ pThreadSend=::AfxBeginThread(_SendThread,this); return;
}
//当发送文件请求被拒绝 if(pMsg->m_nType==REFUSE){ m_bIsWait=FALSE;
MessageBox(_T(\请求被拒绝\
_T(\警MB_ICONEXCLAMATION); return ;
}
//当对方取消文件传输时执行该if语句里面的内容 if(pMsg->m_nType == CANCEL) { m_bIsWait = FALSE; return ; }
3、文件传输模块
资料.
告\
.
两个线程:
_ListenThread():建立新的监听套接字,准备接收文件
_SendThread(): 建立客户端套接字,连接监听套接字,发送文件 当两方建立了可靠的连接,一方选择文件后,就会使用传输控制模
块给对方发送文件发送请求,对方的ProcessReceive接收到后查看当前的消息状态,(上个模块的OnReceive已经写得很清楚),同意接受后,开启文件接收线程,同时给发送方返回一个准备完成状态,于是,发送方开启文件发送线程,最后完成文件的传输工作,同时置状态m_bIsStop为TRUE,便于双方传输控制
① 发送线程关键函数SendFile
void CSendFileDlg::SendFile(CSocket& senSo)
资料.
.
{ }
m_ctrlProgress.SetRange32(0,m_dwFileSize); int nSize=0,nLen=0; DWORD dwCount = 0; char buf[BLOCKSIZE]={0}; file.Seek(0,CFile::begin); //开始传送 while(1) {
//每次读取BLOCKSIZE大小 nLen=file.Read(buf,BLOCKSIZE); m_bIsTransmitting=TRUE; CFile file;
if (!file.Open(m_strPath,CFile::modeRead|CFile::typeBinary)) {
AfxMessageBox(_T(\文件打开失败\
senSo.Close(); return ;
资料.
.
if(nLen==0)
break;
//发送文件内容
nSize=senSo.Send(buf,nLen); dwCount+=nSize;
m_ctrlProgress.SetPos(dwCount); CString strTransfersSize;
strTransfersSize.Format(\字节\//设置进度条属性
GetDlgItem(IDC_RECEIVE_SIZE)->SetWindowText(strTransf
ersSize);
int p=((double)dwCount)/((int)m_dwFileSize+1)*100+1; strTransfersSize.Format(\strTransfersSize+=\
//判断用户是否停止发送 if(m_bIsStop) { }
m_bIsStop=FALSE; break;
资料.
.
}
② 接收线程关键函数ReceiveFile
void CSendFileDlg::ReceiveFile(CSocket& recSo) {
//停止等待超时计时器 KillTimer(2); m_bIsWait=FALSE;
m_bIsTransmitting=TRUE; //正在传输置1 if(m_dwFileSize==dwCount)
AfxMessageBox(_T(\文件发送成功\ }
file.Close(); senSo.Close();
if (nSize==SOCKET_ERROR)
break;
else
AfxMessageBox(_T(\文件发送失败\
m_ctrlProgress.SetPos(0); m_bIsTransmitting = FALSE;
资料.