时间问题,在转载这个代码前,没有经过测试,大家自己测试一下,如果有什么问题,再跟我们联系。
//1:显示文件进度
//2:可以随时终止传输过程
//发送数据线程
UINT SendDataThread(LPVOID lpParam);
//接收数据线程
UINT ReceiveDataThread(LPVOID lpParam);
//发送数据按钮消息响应函数
void CTzg004Dlg::OnButtonSend()
{
// TODO: Add your control notification handler code here
//初始化数据发送结束标志
m_bSendEnd=FALSE;
//初始化数据接收结束标志
m_bRecEnd=FALSE;
//更新对话框数据
UpdateData(TRUE);
//打开文件对话框
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWR99vEPROMPT,
"所有文件 (*.*)|*.*||");
if(dlg.DoModal()==IDOK)
{
m_strFileName=dlg.GetPathName();
//开始发送数据线程
AfxBeginThread(SendDataThread,this,THREAD_PRIOR99vY_NORMAL);
}
}
//接收数据按钮消息响应函数
void CTzg004Dlg::OnButtonReceive()
{
// TODO: Add your control notification handler code here
//初始化数据发送结束标志
m_bSendEnd=FALSE;
//初始化数据接收结束标志
m_bRecEnd=FALSE;
UpdateData(TRUE);
//开始接收数据线程
AfxBeginThread(ReceiveDataThread,this,THREAD_PRIOR99vY_NORMAL);
}
//终止发送按钮消息响应
void CTzg004Dlg::OnButtonSendEnd()
{
// TODO: Add your control notification handler code here
//设置发送数据结束标志
m_bSendEnd=TRUE;
}
//终止接收按钮消息响应
void CTzg004Dlg::OnButtonRecEnd()
{
// TODO: Add your control notification handler code here
//设置接收数据结束标志
m_bRecEnd=TRUE;
}
UINT SendDataThread(LPVOID lpParam)
{
CTzg004Dlg *pDlg=(CTzg004Dlg *)lpParam;
CFile file;
if( !file.Open(pDlg->m_strFileName, CFile::modeRead) )
{
AfxMessageBox("打开文件出错!");
return 0;
}
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)
{
int iEnd=pDlg->m_bSendEnd;
//传送发送端状态(是否结束)
iNumByte = sockSend.Send(&iEnd, sizeof(int));
//发送错误
if(iNumByte == SOCKET_ERROR)
{
AfxMessageBox("发送错误!");
goto ExitLable1;
}else if(iEnd==1)//发送端终止
{
AfxMessageBox("发送端终止");
goto ExitLable1;
}
//读取文件内容
if((int)(uiLength - uiTotal) < iBufSize)
iSize = uiLength - uiTotal;//当小于缓冲区iTEST时的处理
iSize=file.Read(pBuf , iSize);//得到读取的字节数
int iCount=0;
//发送定长文件数据
while(iCount<iSize)
{
iNumByte = sockSend.Send(pBuf, iSize-iCount);//注意iNumByte为实际的发送字节数,不要以iSize为准
if(iNumByte == SOCKET_ERROR)
{
AfxMessageBox("发送错误!");
goto ExitLable1;
}
iCount+=iNumByte;
if(iCount<iSize)
{
 正文:http://www.qqread.com/vc/c239188.html进入讨论组讨论。
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- Google在线翻译--请输入要翻译的内容 (59859次浏览)
- VC++动态链接库(DLL)编程深入浅出(二) (15435次浏览)
- VC++动态链接库(DLL)编程深入浅出(一) (13930次浏览)
- 基于OpenGL的三维曲面数据场动态显示 (607次浏览)
- 深入浅出Win32多线程设计之MFC的多线程 (531次浏览)
- 利用钩子技术控制进程创建(附源代码) (530次浏览)
- Visual C++初学者入门的一条捷径 (365次浏览)
- RS-232-C端口实时监控软件的设计实现 (326次浏览)
- Windows Gdi 应用-入门篇 (VC SDK) (317次浏览)
- Windows多线程多任务设计初步 (313次浏览)



