用VC++编制FTP客户端应用程序

用VC++编制FTP客户端应用程序

  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上运行通过。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
自己写的ftp服务端程序代码,支持{"USER", do_user }, {"PASS", do_pass }, {"CWD", do_cwd }, {"XCWD", do_cwd }, {"CDUP", do_cdup }, {"REIN", do_rein },//重新初始化,此命令终止USER,重置所有参数,控制连接仍然打开,用户可以再次使用USER命令 {"QUIT", do_quit }, /*------------传输参数命令------------*/ {"PORT", do_port },//数据端口,主要向服务器发送客户数据连接的端口 //格式为PORT h1,h2,h3,h4,p1,p2,其中32位的IP地址用h1,h2,h3,h4表示,16位的TCP端口号用p1,p2表示 {"PASV", do_pasv },//此命令要求服务器数据传输进程在指定的数据端口侦听,进入被动接收请求的状态 {"TYPE", do_type },//文件类型,可指定ASCII码、EBCDIC码、Image、本地类型文件等参数 /*------------服务命令----------------*/ {"RETR", do_retr },//下载文件 {"STOR", do_stor },//上传 {"APPE", do_appe },//上传,如文件已存在,数据附加到尾部 {"REST", do_rest },//重新开始 {"RNFR", do_rnfr }, {"RNTO", do_rnto },//重命名文件或目录 {"ABOR", do_abor },//异常终止 {"DELE", do_dele },//删除文件 {"RMD", do_rmd },//删除目录 {"XRMD", do_rmd }, {"MKD", do_mkd },//新建目录 {"XMKD", do_mkd }, {"PWD", do_pwd },//打印当前目录 {"XPWD", do_pwd }, {"LIST", do_list },//列目录详细清单 {"NLST", do_nlst },//列目录短清单 {"SYST", do_syst },//获取系统信息 {"STAT", do_stat },//返回服务器状态 {"SIZE", do_size },//获得文件大小 {"HELP", do_help }, {"NOOP", do_noop }, {"SITE", do_site }, }等命令
基于Qt实现的FTP客户端和服务端程序是一种用于文件传输的网络应用程序。Qt是一个跨平台的开发框架,可以帮助开发者简化程序编写过程并实现不同操作系统下的程序兼容性。 FTP客户端通过用户操作,可以连接到FTP服务端,并进行文件的上传和下载操作。FTP客户端程序提供了用户界面,包括登录信息的输入、文件列表的展示以及上传下载按钮等。用户可以通过FTP客户端上传本地文件到FTP服务器,或者从FTP服务器下载文件到本地。上传、下载的过程中,FTP客户端会与FTP服务端进行交互,通过FTP协议进行数据传输。 FTP服务端程序则负责接收FTP客户端的连接,处理客户端的请求,并根据请求进行文件的上传和下载。FTP服务端通过监听指定的端口号,等待客户端的连接请求。一旦有客户端的连接请求,服务端接受连接,并通过鉴权确认客户端的身份。服务端程序接收客户端的上传请求后,将文件保存在服务器指定的位置;接收客户端的下载请求后,从服务器指定位置读取文件并发送给客户端。 基于Qt的FTP客户端和服务端程序可以实现跨平台的文件传输功能,提供了图形化的用户界面和方便的操作方式。科研工作者、程序员、企业等可以使用FTP客户端和服务端程序,方便地在不同设备之间进行文件传输,提高工作效率。此外,通过FTP的鉴权机制,可以保证文件传输的安全性,更好地满足用户的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝈蝈俊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值