3.3.7 具体实现(3)
2. 定义CFtp类
CFtp类是用户自定义实现FTP功能和原理的非常重要的类。在这里,用户将学习到怎样在Visual C++(www.cppentry.com) 2010环境中定义和封装CFtp类的方法。
(1) 定义头文件Ftp.h,具体代码如下:
- class CFtp //定义CFtp类
- {
- public:
- CString ipaddr, name, password; //IP地址、用户名、密码
- int port; //端口号码
- BOOL FTPConnect(CString severhost, int port); //连接FTP服务器
- CSocket *m_clientsocket; //套接字对象
- CArchive *archive; //串行化对象
- CSocketFile *socketfile; //套接字文件对象
- private:
- CString Recv(); //接收命令消息
- void Send(CString st); //发送命令消息
- void UpdataFile(CString str); //上传文件
- void DownLoadFile(CString str1); //下载文件
- void GetFileStatu(char ch); //获取文件属性
- }
从上述CFtp类声明代码中可以看到FTP编程(www.cppentry.com)相关的数据和实现方法。
(2) 根据FTP基本功能介绍每个函数。首先,客户端应该连接服务器,登录方式为匿名。函数FTPConnect()的实现代码如下:
- BOOL CFtp::FTPConnect(CString severhost, int port)
- {
- CSocket *m_clientsocket = new CSocket(); //构造连接套接字对象
- m_clientsocket->Create(21,
- SOCK_STREAM, FD_READ|FD_WRITE, NULL); //创建流式套接字
- if(!m_clientsocket) //判断套接字对象创建是否成功
- { MessageBox("套接字创建失败!"); return false; } //创建m_clientsocket失败
- if(!(m_clientsocket->Connect((atoi)severhost, port)))
- return false; //连接FTP服务器
- else
- { return true;} //连接成功将返回true
- }
客户端连接FTP服务器,成功则返回True,否则返回False。
(3) 如果连接成功,则需要向服务器发送命令以初始化服务器和获取服务器文件列表。函数Send()的实现代码如下:
- void CFtp::Send(CString charstring) // Send()函数发送信息到服务器
- {
- CSocketFile *socketfile; //定义对象指针
- socketfile =
- new CSocketFile(m_clientsocket); //关联对象m_clientsocket是创建的套接字
- archive = new CArchive(&m_sockfile,
- CArchive::load|CArchive::store); //创建对象archive的实例并指定属性
- charstring = "USER" + lymlrl + "PASS" + 123456"; //构造字符串charstring
- archive.WriteString(" " + "\r\n"); //向服务器发送空字符串进行初始化
- try {
- archive->WriteString(charstring
- + "\r\n"); //调用CArchive类的WriteString发送命令
- archive->Flush(); //强制写入命令到服务器
- }
- Catch(CException e) //处理被抛出的异常
- {
- MessageBox("发送关闭命令失败!");
- }
- }
(4) 当命令发送后,服务器会返回客户端请求的数据。函数Recv()的实现代码如下: - //Recv()函数接收服务器返回的数据
- CString CFtp::Recv()
- {
- CString recvstr = " "; //初始化字符串recvstr为空
- if(archive->ReadString(recvstr)) //接收返回信息并放到recvstr变量
- {
- if(recvstr == " ") MessageBox("接收数据为空"); //如果接收的数据为空则提示
-
- {
- MessageBox("接收数据成功");
- return recvstr; //返回接收到的数据
- }
- }
- else
- {
- MessageBox("接收数据失败"); //提示接收数据失败
- }
- }