WEB开发网
开发学院软件开发VC 基于select I/O模型的远程目录浏览与多线程文件下... 阅读

基于select I/O模型的远程目录浏览与多线程文件下载

 2007-03-17 22:00:56 来源:WEB开发网   
核心提示: void CFileTransCltView::FillInFile(SOCKET socket, int thrInfo, int packIndex, char* pPackCont){// thrInfo末两位为下载线程总数,再上两位为当前线程序号int thrIndex = thr
void CFileTransCltView::FillInFile(SOCKET socket, int thrInfo, int packIndex, char* pPackCont)
{
  // thrInfo末两位为下载线程总数,再上两位为当前线程序号
  int thrIndex = thrInfo/100;      // 当前线程序号
  int thrTotal = thrInfo-thrIndex*100;  // 下载线程的总数
  int thrLength = fSize/thrTotal; // 当前线程要下载的文件长度
  int bPoint = (thrIndex-1)*thrLength; // 当前线程要下载的文件起点
  if( thrIndex == thrTotal )
    thrLength = fSize-bPoint; // 当前线程等于线程总数,则重新赋予要下载的文 //件长度
  FILE *file;
  if( (file = fopen( savePath, "ab" )) == NULL )
    AfxMessageBox( "Open file occur an error
" );
  // 每个线程都会试图打开文件, 如果已打开, 返回文件流指针。 为什么这样?因为
  //在TCP下载文件时, 线程的包是按顺序来的, 但线程却不一定会按前后顺序执行。
  int packTotal = thrLength/2000 +1;
  int subTotal = packTotal;
  DATA_PACKET dPacket;
  while( subTotal>0 )
  {
    critSection.Lock(5000);
    fseek( file,bPoint+(packIndex-1)*2000,SEEK_SET );
    if( packIndex == packTotal ) //the last packet in thread,data maybe less than 2000B
    {
      int fLength = thrLength-(packTotal-1)*2000;
      int errorcode=fwrite( pPackCont,1,fLength,file);
      fflush(file);
      recvFSize+=fLength;
    }
    else
    {
      fwrite( pPackCont,sizeof(char),2000,file );
      fflush(file);
      recvFSize+=2000;
    }
    critSection.Unlock();
    subTotal--;
    if( subTotal>0 )
    {
      if( recv( socket, (char*)&dPacket, sizeof(dPacket), 0 ) != 0 )
      {
        packIndex = dPacket.length;
        Memcpy( pPackCont, dPacket.content, sizeof(dPacket.content) );
      }
    }
    else
    { // 该线程下载任务完成, 判断是否已经完全下载完文件, 如果是则关闭
      if( recvFSize == fSize )
        fclose(file);
      return;
    }
  }
}

3. 客户端线程函数

上一页  1 2 3 4 5 6 7  下一页

Tags:基于 select 模型

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接