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

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

 2007-03-17 22:00:56 来源:WEB开发网   
核心提示: DWORD WINAPI CFileTransCltView::ThreadRequest(LPVOID lpParameter){DATA_PACKET requestPacket=*(DATA_PACKET*)lpParameter;SOCKET socket=::socket(AF_
DWORD WINAPI CFileTransCltView::ThreadRequest(LPVOID lpParameter)
{
  DATA_PACKET requestPacket=*(DATA_PACKET*)lpParameter;
  SOCKET socket=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  sockaddr_in sin;
  sin.sin_addr.S_un.S_addr=inet_addr(strIP);
  sin.sin_family=AF_INET;
  sin.sin_port=htons(1032);
  if(::connect(socket,(sockaddr*)&sin,sizeof(sin))!=0)
  {
    AfxMessageBox("Request failure!");
    return 0;
  }
  int thrInfo;
  if( requestPacket.packetType=='D' ) //save download thead infomation for function
    // FillInFile()
  {
    thrInfo=requestPacket.length;
    thrFlag=true;
  }
  ::send( socket,(char*)&requestPacket,sizeof(requestPacket),0 );
  memset( requestPacket.content,0,sizeof(requestPacket.content) );
  if( ::recv(socket,(char*)&requestPacket,sizeof(requestPacket),0) )
  {
    if( requestPacket.packetType=='r' )
    {
      int szBuffer=requestPacket.length;
      pDrives=new char[2000]; //Make sure that allocate memery!
      memcpy(pDrives,requestPacket.content,szBuffer); //Make sure that use memcpy()
    }
    if(requestPacket.packetType=='d' )
    {
      pDrives=new char[2000]; // 再次为pDrives分配空间才不会出错
      Memcpy( pDrives,requestPacket.content,sizeof(requestPacket.content) );
      /* 2000 will take an error ?????*/
      //char's pointer to CString Array
      int i=0,j=0;
      while( i<requestPacket.length )
      {
        for(int k=0; pDrives[i]!='|' && i<requestPacket.length ; k++,i++ )
        arrFiles[j].Insert(k,pDrives[i]);
        i++;
        j++;
      }
      return 0;
    }
    if( requestPacket.packetType=='f' )
      fSize=requestPacket.length;
    //Download file
    if( requestPacket.packetType=='D' )
    {
      //memset( pDrives,0,2000 );
      Memcpy( pDrives,requestPacket.content,sizeof(requestPacket.content) );
      FillInFile( socket,thrInfo,requestPacket.length,pDrives);
    }
  }
  ::closesocket(socket);
  return 0;
}

四 程序结构图

看别人的程序绝对不是一件好事, 要看个明白就更难了, 特别是没有算法描述甚至一句注释都没有的程序。所以把程序流程图画了出来,好明白一些。

1. 服务器端

服务器端的大致流程就是这样, 线程里面就是select(...)。不过有些判断和出错处理未画出。从商业程序角度看来,有两点是很重要的, 一是捕获异常和出错处理, 二是简洁高效。我们编程应往这方面靠拢。

     图1

2. 客户端

                      图2

3. 客户端线程

          图3

4. 双击树项目:

  图4

5. 写文件FillInFile

图5

上一页  2 3 4 5 6 7 

Tags:基于 select 模型

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