CSocket文件传输 分段传输的关键代码

CSocket文件传输 分段传输的关键代码

 

分段传输的关键代码

 

struct  FILEINFO
{
  int  fileLength; //文件长度
  char  fileName[100]; //文件名
};

  

 

服务器:

CFileDialog fileDialog(TRUE); //选择文件
  if  (fileDialog.DoModal()==IDOK)
  {
        CString filename = fileDialog.GetPathName(); //文件路径
         CString name = fileDialog.GetFileName(); //文件名字
         
   //发送文件
   CFile file;
   if (file.Open(filename,CFile::modeReadWrite|CFile::typeBinary))
   { //打开文件
  
 
    FILEINFO myFileInfo; //文件结构
    int  length = file.GetLength(); //获取文件的长度
    m_CtrlProgressSend.SetRange32(0,length); //设置进度条大小
    m_CtrlProgressSend.SetPos(0);
    myFileInfo.fileLength = length; //赋值文件长度
    strcpy (myFileInfo.fileName,name.GetBuffer(name.GetLength())); //拷贝文件名
    name.ReleaseBuffer(); //释放buffer
    
    int  iBufSize = 1024*5; //设置文件缓冲区长度
    int  iSize = iBufSize ; //一次读取的长度
    LPBYTE  pBuf= new  BYTE [iBufSize]; //定义缓冲区
 
   
    m_sockClient.Send(&myFileInfo, sizeof (myFileInfo)); //发送文件头信息
 
    //发送文件
    int  iNnmByte;
    UINT  uiTotal = 0 ;
    while  (uiTotal<length)
    {
     if  (length-uiTotal < iBufSize) //如果发送小于1024*5 ,则发送剩余那些....
          iSize = length-uiTotal;
     iSize = file.Read(pBuf,iSize); //读取文件到缓冲区
 
     iNnmByte = m_sockClient.Send(pBuf,iSize); //发送剩下iSize-iCount的文件
     uiTotal += iNnmByte; //uiTotal总发送量
     m_CtrlProgressSend.SetPos(uiTotal);
 
    }
 
   }
   m_info.ReplaceSel( "发送文件完毕\r\n" );
   file.Close();
  }
 
  m_CtrlProgressSend.SetPos(0);
}

  

 

 

客户端

 

FILEINFO myFileInfo;
m_client.Receive(&myFileInfo, sizeof (myFileInfo)); //接受文件信息
 
m_progress.SetRange32(0,myFileInfo.fileLength); //设置进度
 
 
CString str;
str.Format(myFileInfo.fileName); //文件名字
 
CFile file;
if  (file.Open(str,CFile::modeCreate|CFile::modeWrite))
{
     UINT  uiLength;
     uiLength = myFileInfo.fileLength ; //文件长度
     
     int  iBufSize = 1024*5;
     int  iSize = iBufSize ;
     LPBYTE  pBuf = new  BYTE [iBufSize];
     int  iNumByte;
     UINT  uiTotal = 0 ;
     
     
     while  (uiTotal < uiLength)
     {
         if  (uiLength-uiTotal<iBufSize)
             iSize = uiLength - uiTotal ;
         
         iNumByte = m_client.Receive(pBuf,iSize);
         file.Write(pBuf,iNumByte); //写入文件
         uiTotal+=iNumByte;
         m_progress.SetPos(uiTotal);
         
         
     }
     
     if  (pBuf)
     {
         delete []  pBuf;
         pBuf = NULL;
     }
}
file.Close();
m_info.ReplaceSel( "接受文件成功\r\n" );
m_progress.SetPos(0);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值