频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

一个Socket传输文件的例子

来源: 作者: 出处:巧巧读书 2006-09-08 进入讨论组

  时间问题,在转载这个代码前,没有经过测试,大家自己测试一下,如果有什么问题,再跟我们联系。

//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进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
最新论坛文章
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章