用异步,SOCKET,从服务器端向客户端传送文件
谁能给个方法 该怎么做?

解决方案 »

  1.   

    int   CDataSocket::Receive()   
      {   
      int   nRead   =   0;   
        
      if   (m_nStatus   ==   XFERMODE_RECEIVE)   
      {   
      if   (m_File.m_hFile   ==   NULL)   
      return   0;   
        
      byte   data[PACKET_SIZE];   
      nRead   =   CAsyncSocket::Receive(data,   PACKET_SIZE);   
        
      switch(nRead)   
      {   
      case   0:   
      {   
      m_File.Close();   
      m_File.m_hFile   =   NULL;   
      Close();   
      //   tell   the   client   the   transfer   is   complete.   
      m_pConnectSocket->SendResponse("226   Transfer   complete   4");   
      //   destroy   this   socket   
      AfxGetThread()->PostThreadMessage(WM_THREADMSG,   0,   0);   
      //   upload   succesfull   
      ((CConnectThread   *)AfxGetThread())->UpdateStatistic(FTPSTAT_UPLOADSUCCEEDED);   
      ProcessFiles();   
      break;   
      }   
      case   SOCKET_ERROR:   
      {   
      if   (GetLastError()   !=   WSAEWOULDBLOCK)   
      {   
      m_File.Close();   
      m_File.m_hFile   =   NULL;   
      Close();   
      m_pConnectSocket->SendResponse("426   Connection   closed;   transfer   aborted.   SOCKET_ERROR");   
      //   destroy   this   socket   
      AfxGetThread()->PostThreadMessage(WM_THREADMSG,   0,   0);   
      //   upload   failed   
      ((CConnectThread   *)AfxGetThread())->UpdateStatistic(FTPSTAT_UPLOADFAILED);   
        
      }   
      break;   
      }   
      default:   
      {   
      ((CConnectThread   *)AfxGetThread())->IncReceivedBytes(nRead);   
        
      TRY   
      {   
      m_File.Write(data,   nRead);   
      }   
      CATCH_ALL(e)   
      {   
      m_File.Close();   
      m_File.m_hFile   =   NULL;   
      Close();   
      m_pConnectSocket->SendResponse("450   can't   access   file.");   
      //   destroy   this   socket   
      AfxGetThread()->PostThreadMessage(WM_THREADMSG,   0,   0);   
      //   upload   failed   
      ((CConnectThread   *)AfxGetThread())->UpdateStatistic(FTPSTAT_UPLOADFAILED);   
      ProcessFiles();   
      return   0;   
      }   
      END_CATCH_ALL;   
        
      break;   
        
      }   
      }   
      }   
      return   nRead;   
      }   
        
        
        
      void   CDataSocket::OnReceive(int   nErrorCode)     
      {   
      CAsyncSocket::OnReceive(nErrorCode);   
        
      Receive();   
      }   
        
      void   CDataSocket::OnAccept(int   nErrorCode)     
      {   
      CAsyncSocket   socky;   
      Accept(socky);   
        
      SOCKET   socket   =   socky.Detach();   
      Close();   
        
      Attach(socket);   
        
      m_bConnected   =   TRUE;   
      m_pConnectSocket->SendResponse("150   Connection   accepted");   
        
      CAsyncSocket::OnAccept(nErrorCode);   
        
      m_bPassiveMode   =   TRUE;   
      //m_bPassiveMode   =   FALS   
      }   
        
        
      void   CDataSocket::OnConnect(int   nErrorCode)     
      {   
      if   (nErrorCode)   
      {   
      m_nStatus   =   XFERMODE_ERROR;   
      m_pConnectSocket->SendResponse("425   Can't   open   data   connection.   4");   
      //   destroy   this   socket   
      AfxGetThread()->PostThreadMessage(WM_THREADMSG,   0,   0);   
      }   
      else   
      {   
      switch   (m_nTransferType)   
      {   
      case   0: //   List   Directory   
      m_nStatus   =   XFERMODE_LIST;   
      m_bConnected   =   TRUE;   
      // m_nTotalBytesSend   =   m_strData.GetLength();   
      // m_nTotalBytesTransfered   =   0;   
      OnSend(0);   
      // Send(m_strData,   m_strData.GetLength());   
      break;   
      case   1: //   Send   File   
      if   (PrepareSendFile(m_strData))   
      {   
      m_nStatus   =   XFERMODE_SEND;   
      m_bConnected   =   TRUE;   
      }   
      else   
      {   
      Close();   
      }   
      break;   
      case   2: //   Receive   File   
      if   (PrepareReceiveFile(m_strData))   
      {   
      m_nStatus   =   XFERMODE_RECEIVE;   
      m_bConnected   =   TRUE;   
      }   
      else   
      {   
      Close();   
      m_pConnectSocket->SendResponse("450   can't   access   file.");   
      //   destroy   this   socket   
      AfxGetThread()->PostThreadMessage(WM_THREADMSG,   0,   0);   
      //   upload   failed   
      ((CConnectThread   *)AfxGetThread())->UpdateStatistic(FTPSTAT_UPLOADFAILED);   
      }   
      break;   
      }   
      }   
      CAsyncSocket::OnConnect(nErrorCode);   
      }
      

  2.   

    我是这样做的
    协议 udp,服务器端ip固定服务器端先绑定套接字,然后注册网络读取事件,之后接受客户端发送来的任意内容,通过recvfrom函数的参数得到客户端的ip地址,和端口。然后在相应的事件消息里发送指定的文件给客户端。
    客户端注册网络读取事件,然后给服务器端发送任意内容,之后在消息相应事件里接受发送过来的文件。
    运行时先相应客户端。这样做有什么问题么?为什么我实现不了。接受数据失败?
      

  3.   

    关于我设置的两个读取事件,都设置为FD_READ可以么
      

  4.   

    传输文件怎么用UDP?传输文件要求可靠性高,如果你需要做好点的,我可以给你弄个高性能的服务器,ICOP完成端口形式的。1个小时以上的工作量,进行收费服务。
      

  5.   

    无非就是socket编程。建议看一下《Windows网络编程》或多上www.codeproject.com/internet看。
    用UDP传输文件的话,关键是需要处理选择包与重传。