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

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

 2007-03-17 22:00:56 来源:WEB开发网   
核心提示: DWORD WINAPI CFileTransSvrView::ThreadSelect(LPVOID lpParameter){// 初始化fd_setSOCKET sListen=(SOCKET)lpParameter;fd_set fdSocket;FD_ZERO(&fdSocket
DWORD WINAPI CFileTransSvrView::ThreadSelect(LPVOID lpParameter)
{
  // 初始化fd_set
  SOCKET sListen=(SOCKET)lpParameter;
  fd_set fdSocket;
  FD_ZERO(&fdSocket);
  FD_SET(sListen,&fdSocket);
  // 不断循环遍历fd_set, 如果某项置位, 则表示该socket可用, 如果状态为正在侦听,
  // 则建立连接, 并把它加入到fd_set中, 否则就等待接收数据。select有自动机制把不可
  //用的socket从fd_set中删除。
  while(TRUE)
  {
    fd_set fdRead=fdSocket;
    int nRet=::select(0, &fdRead, NULL, NULL, NULL);
    if(nRet>0)
    {
      for(int i=0;i<(int)fdSocket.fd_count;i++)
      {
        if(FD_ISSET(fdSocket.fd_array[i],&fdRead))  
        {
          if(fdSocket.fd_array[i] == sListen)  
          {
            sockaddr_in addrRemote;
            int nAddrLen=sizeof(addrRemote);
            SOCKET sNew=::accept(sListen,(sockaddr*)&addrRemote,&nAddrLen);
            FD_SET(sNew,&fdSocket);
          }
          else
          {
            DATA_PACKET recvPacket;
            int nRecev=::recv(fdSocket.fd_array[i], (char*)&recvPacket,
              sizeof(recvPacket), 0)。
            if(nRecev>0)
            {
              // respond request
            }
            else
            {
              ::closesocket(fdSocket.fd_array[i]);
              FD_CLR(fdSocket.fd_array[i], &fdSocket);
            }
          }
        }
      }
    }
  }
  return 0;
}

2 文件下载函数

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

Tags:基于 select 模型

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