CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

关于下载,在线

楼主yhspring()2003-06-04 08:58:33 在 VC/MFC / 基础类 提问

为什么我写的FTP程序(客户和服务端)第一次点击下载的文件只有0KB,第二次才能成功。 问题点数:100、回复次数:9Top

1 楼yhspring()回复于 2003-06-04 09:05:00 得分 0

void   CRemoteControlView::OnDownload()    
  {  
  //   TODO:   Add   your   control   notification   handler   code   here  
          PreparePort(2);  
  CString   strBuffer,   strCommand;  
  CString   strSelectedLine;  
   
  m_bGetAll   =   FALSE;  
  UpdateData(TRUE);  
  //m_strMessage.Empty();  
  //m_strLocalFile.Empty();  
          UpdateData(FALSE);  
   
         
  m_pTransportSocket->m_bGetOrPut   =   TRUE;  
               
  if   (NULL   !=   m_pTransportSocket->m_pFile)   delete   m_pTransportSocket->m_pFile;  
  if   (m_bCheck)  
  {  
  m_pControlSocket->m_slSendBuffer.AddTail("TYPE   I\r\n");  
  m_pTransportSocket->m_pFile   =   new   CFile(m_strLocalFile,CFile::modeCreate|  
  CFile::modeReadWrite   |   CFile::typeBinary   );  
          m_pControlSocket->OnSend(0);  
  }  
  else  
  {        
  //AfxMessageBox("false",NULL,MB_OK);  
  m_pControlSocket->m_slSendBuffer.AddTail("TYPE   A\r\n");  
   
  m_pTransportSocket->m_pFile   =   new   CStdioFile(m_strLocalFile,CFile::modeCreate|  
  CFile::modeReadWrite|   CFile::typeText);  
          m_pControlSocket->OnSend(0);  
  }  
          //m_strLocalFile.ReleaseBuffer();  
   
  strCommand   =   "RETR   "   +   m_strRemoteFile   +   "\r\n";  
  m_pControlSocket->m_slSendBuffer.AddTail(strCommand);  
  m_pControlSocket->OnSend(0);  
   
  }  
  Top

2 楼yhspring()回复于 2003-06-04 09:05:41 得分 0

void   CTransportSocket::OnReceive(int   nErrorCode)  
  {  
  int   nReceive,   n   =   4096;  
  CString   strBuffer;  
  char   *pBuffer   =   strBuffer.GetBuffer(n);  
   
  while   ((SOCKET_ERROR     !=   (nReceive   =   Receive(pBuffer,   n)))   &&   (0   !=   nReceive))  
  m_pFile->Write(pBuffer,   nReceive);  
  }  
  Top

3 楼awnucel(西大耻犹未雪,南京恨何时灭&抵制日货)回复于 2003-06-04 09:33:59 得分 0

没看出来Top

4 楼yhspring()回复于 2003-06-04 10:37:56 得分 0

upTop

5 楼yhspring()回复于 2003-06-04 14:06:19 得分 0

upTop

6 楼Linux2001(闭关开发中)回复于 2003-06-04 14:41:37 得分 0

自己下断点跟踪一下吧Top

7 楼feiniaoliang(♂飞鸟良♀)回复于 2003-06-04 15:12:40 得分 100

自己看吧!!!!  
   
  FTP协议将使用两条单独的TCP连接,一条专用于发送FTP命令,另一条则专用于传  
  递数据。初始建立连接时,服务器在21号端口上接收来自客户端的命令连接。当需要传  
  送数据时(文件列表、文件数据等),客户端向服务器发出Port命令,并进入监听状  
  态,等待来自服务器的数据连接请求。  
   
    首先我们利用VC++   6.0的AppWizard创建一个基于对话框的应用程序,命名为  
  FtpClientDemo。为程序生成五个基于CAsyncSocket的新类,这里列出主要代码。  
   
   
    CCommandSocket类的主要代码  
   
    void   CCommandSocket::OnReceive(int   nErrorCode)  
   
      
   
   
    //这个函数使得服务器的应答消息显示在编辑框上  
   
       char   buffer=new   char[4096];  
   
       memset(buffer,0,4096);  
   
       this-〉Receive(buffer,1024,0);  
   
    //接收应答消息  
   
       MessageList+=buffer;  
   
       m_ReturnMessage-〉SetWindowText(MessageList);  
   
       delete   buffer;  
   
    }  
   
    CFileSocket类的主要代码  
   
      void   CFileSocket::OnReceive(int   nErrorCode)  
   
      
   
   
    //函数将收到的文件数据写到文件中  
   
       if(File=   =NULL)  
   
       {   File=new   CFile();  
   
       File-〉Open(FileName,CFile::modeWrite|CFile::modeCreate);  
   
       }  
   
       charbuffer=new   char[4096];  
   
       memset(buffer,0,4096);  
   
       this-〉Receive(buffer,4096,0);  
   
       ReceiveString=buffer;  
   
       File-〉Write(ReceiveString,ReceiveString.GetLength(   ));  
   
       delete   buffer;  
   
    }  
   
    CReceiveSocket类的主要代码  
   
    void   CReceiveSocket::OnReceive(int   nErrorCode)  
   
      
   
   
    //接收服务器传来的文件列表消息  
   
       CString   ReceiveString,Temp;  
   
       charbuffer=new   char[4096];  
   
       memset(buffer,0,4096);  
   
       this-〉Receive(buffer,4096,0);   //接收消息  
   
       ReceiveString+=buffer;  
   
       delete   buffer;  
   
    //将文件列表从收到的消息字符串中分离出来,并显示在列表框中  
   
       while(!ReceiveString.IsEmpty())  
   
       {   int   p=ReceiveString.Find("\r\n");  
   
    if(p!=-1)  
   
    {   Temp=ReceiveString.Left(p);  
   
       ReceiveString=ReceiveString.Right(ReceiveString.GetLength()-p-2);  
   
    DisplayMessage-〉AddString(Temp);  
   
       }  
   
    }  
   
    }  
   
    CPortSocket类主要代码  
   
    void   CPortSocket::OnAccept(int   nErrorCode)  
   
      
   
   
    //根据不同的标志选择相应的数据连接类,以接受服务器端的数据连接请求  
   
       if(Flag=   =LISTFILE)  
   
    //若程序要求对目录进行列表,则采用CReceiveSocket类  
   
       {DataSocket=new   CReceiveSocket(FileList);  
   
       this-〉Accept(DataSocket);  
   
       }  
   
       else   if(Flag=   =DOWNLOAD)  
   
    //若程序要求下载文件,则生成CFileSocket类的对象  
   
    {FileSocket=new   CFileSocket(FileName);  
   
    this-〉Accept(FileSocket);  
   
       }  
   
    }  
   
    主对话框类CFtpClient-   DemoDlg的主要代码  
   
      void   CFtpClientDemoDlg::OnFileList()  
   
    //响应“文件列表”按钮、列表目录  
   
    {   CString   Temp;  
   
       if(ControlSocket=   =NULL)  
   
      
   
   
    //连接到FTP服务器  
   
    ControlSocket=new   CCommandSocket(&&m_ReturnMessage);  
   
    ControlSocket-〉Create();  
   
    m_Server.GetWindowText(Temp);  
   
    ControlSocket-〉Connect(Temp,21);  
   
    //FTP服务器在21号端口接收连接  
   
       }  
   
       m_User.GetWindowText(Temp);  
   
       Temp="USER   "+Temp+"\r\n";  
   
       ControlSocket-〉Send(Temp,Temp.GetLength(),0);  
   
    //发User命令,验证用户  
   
       m_Pass.GetWindowText(Temp);   //m_Pass为“口令”编辑框的对应控制  
   
       Temp="PASS   "+Temp+"\r\n";  
   
       ControlSocket-〉Send(Temp,Temp.GetLength(),0);  
   
    //发Pass命令,校验口令  
   
       LisentPort(LISTFILE);  
   
    //数据连接的对象为目录列表  
   
       ControlSocket-〉Send("LIST   \r\n",7   ,0);  
   
    //发List命令,要求列表目录  
   
    }  
   
    void   CFtpClientDemoDlg::OnDownLoad(   )  
   
    //下载文件  
   
      
   
   
       CString   String;  
   
       LisentPort(DOWNLOAD);  
   
    //获得要下戴文件的文件名  
   
       m_LocalFile.GetWindowText(String);  
   
    //   m_LocalFile为“文件名”编辑框的对应控制  
   
       String="RETR   "+String+"\r\n";  
   
       ControlSocket-〉Send(String,String.GetLength(   ),0);  
   
    //发RETR命令,下载文件  
   
    }  
   
    void   CFtpClientDemoDlg::LisentPort(UINT   Flag)  
   
      
   
   
    //根据要求选择不同的数据连接对象  
   
       if(LisentSocket!=NULL)  
   
    //清空LisentSocket  
   
       {   LisentSocket-〉Close();  
   
       delete   LisentSocket;  
   
       LisentSocket=NULL;  
   
       }  
   
       if(Flag=   =LISTFILE)  
   
    //如果为目录列表数据连接对象  
   
       {   LisentSocket=new   CPortSocket(LISTFILE);  
   
       LisentSocket-〉SetListBox(&&m_FileList);  
   
    //传列表框到CLisentSocket类中  
   
       }  
   
       else   if(Flag=   =DOWNLOAD)  
   
    //如果为文件传输数据连接对象  
   
       {   CString   String;  
   
       m_LocalFile.GetWindowText(String);  
   
       LisentSocket=new   CPortSocket(DOWNLOAD);  
   
       LisentSocket-〉SetFileName(String);  
   
    //传文件名到CLisentSocket类中  
   
       }  
   
       LisentSocket-〉Create();  
   
    //建立Socket并进行监听,等待FTP服务器进行数据连接  
   
       LisentSocket-〉Listen();  
   
    //取得数据连接Socket的IP地址和监听端口,并把它们作为Port命令的参数  
   
       SOCKADDR_IN   listing_address,   control_address;  
   
       int   addr_size;  
   
       addr_size   =   sizeof(listing_address);  
   
       LisentSocket-〉GetSockName((SOCKADDR   )&&listing_address,  
  &&addr_size);   //  
  取IP地址  
   
       ControlSocket-〉GetSockName((SOCKADDR   )&&control_address,  
  &&addr_size);   /  
  /取端口  
   
    unsigned   char   port   =   (unsigned   char   )&&(listing_address.sin_port);  
   
       unsigned   char   host   =   (unsigned   char   )&&(control_address.sin_addr);  
   
       CString   strBuffer;  
   
       strBuffer.Format("PORT   %i,%i,%i,%i,%i,%i\r\n",(int)host[0],  
  (int)host[1],   (  
  int)host[2],   (int)host[3],(int)port[0],   (int)port[1]);  
   
       ControlSocket-〉Send(strBuffer,strBuffer.GetLength(),0);  
   
    //发送Port命令,进行数据连接  
   
    }  
   
    以上代码在VC++   6.0、Windows   98上运行通过。  
  Top

8 楼yhspring()回复于 2003-06-04 16:46:57 得分 0

呵呵,这个程序和我的差不多嘛Top

9 楼yhspring()回复于 2003-06-05 09:54:16 得分 0

upTop

相关问题

  • 在线rm如何下载
  • 何处下载msdn下载!在线等候!
  • 怎样下载在线电影?
  • 如何下载文件?急!在线....
  • 寻delphi6 的 下载(在线等待)
  • 那里有interdev下载?在线等
  • 哪里可以下载windows.net???在线等!!!
  • 下载问题(急!!!!!在线等待)?????
  • 哪里有Jcreator下载,在线等待。
  • ★★★★★★★在线等待ing...★★★★★★★★★★★ 求 C++Builder 下载地址

关键词

  • vc++
  • 代码
  • 文件
  • 服务器
  • 数据
  • 消息
  • 连接
  • 客户
  • pcontrolsocket
  • receivestring

得分解答快速导航

  • 帖主:yhspring
  • feiniaoliang

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo