4.2 登录FTP服务器
在对FTP文件进行相关处理之前,用户必须在成功连接、登录服务器以后,才可以执行相关的操作。本节将主要讲述FTP的连接以及登录验证过程,选择的连接模式是PASV(被动)模式,登录方式是用户名登录。
4.2.1 连接FTP服务器
因为FTP连接是基于Windows套接字编程(www.cppentry.com)的,所以FTP的连接过程和Socket连接一样。也就是客户端创建连接套接字以后,调用函数Connect()向服务器发送连接请求。用户需要特别注意的是待服务器同意连接并返回后,客户端必须先发送一个空字符串到服务器进行初始化,这样才能进行数据的交换。在连接FTP服务器程序的开发中,用户需要用到MFC的一些类或函数,如CSocket类。
1.实例化CSocket
CSocket类是MFC对Windows套接字的一个封装类。一般,它使用类中的构造函数来实例化对象。但是在实际编程(www.cppentry.com)中,构造函数常使用new关键字来调用,构造一个没有初始化的套接字对象。例如,代码如下:
- CSocket m_clientsocket=new CSocket; //构造一个套接字对象m_clientsocket
构造该对象后,必须调用成员函数Create()创建完整的套接字句柄。其函数原型为:
- BOOL CSocket::Create(UINT nSocketPort,
- int nSocketType=SOCK_STREAM,LPCTSTR lpszSocketAddress=NULL);
在该函数中,参数nSockPort用来指定与套接字相关联的本地端口号,默认值为0,本章实例中均设置为FTP的默认端口21。nSocketType指定套接字类型,默认为SOCK_STREAM表示创建流式套接字,FTP客户端均采用默认类型。lpszSocketAddress指定创建套接字的网络地址,默认为NULL,客户端一般设置为NULL。该函数调用成功返回非0值,否则返回0,表示出错。
2.实现连接功能
用户创建套接字对象以后,就可以调用函数去实现真正的连接了。在CSocket类中,实现连接功能的函数是Connect(),其函数原型如下:
- BOOL Connect(LPCSTR lpszHostAddress,UINT nHostPort);
参数lpszHostAddress指定将要连接的服务器地址;nHostPort指定将要连接服务器上的端口号。注意,一般在FTP编程(www.cppentry.com)中都将此参数设置为21号端口。该函数连接服务器成功,则返回true,否则返回false。例如,用户需要连接一个IP地址为"218.6.132.5"的服务器,则其代码如下:
- CSocket *m_clientsocket=new CSocket(); //构造连接套接字对象
- m_clientsocket->Create(21,SOCK_STREAM,FD_READ|FD_WRITE,NULL);
- //创建流式套接字
- m_clientsocket->Connect("218.6.132.5",21); //连接服务器
这段代码的作用是创建套接字对象以后,调用函数Connect()进行连接服务器的操作。
3.封装连接过程
本节中,FTP的连接过程主要由自定义函数FTPConnect()实现。函数FTPConnect()的作用是根据用户输入的服务器地址和端口号,连接FTP服务器。其返回值表示操作是否成功。其具体代码如下:
- //连接服务器函数,参数severhost 表示服务器IP地址,port指定要连接的服务器端口
- BOOL 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(severhost,port))) return
false; //连接FTP服务器 - else
- { return true;} //连接成功将返回true
- }
在该函数中,参数severhost和port分别指定要连接服务器的地址和端口。程序首先创建流式套接字m_clientsocket,然后调用CSocket类的函数Connect()连接FTP服务器。当连接失败时,函数返回false;否则,返回true。
自定义函数FTPConnect()封装完成后便可以对其进行调用。代码如下:
- Void OnConnect()
- { CString address="218.6.132.5"; //定义IP地址字符串变量并初始化
- int port=21; //定义端口变量并初始化
- if(!(FTPConnect((LPCSTR)address,port))) //判断FTPConnect调用是否成功
- { MessageBox("连接失败!");} //提示失败
- else
- {MessageBox("连接服务器成功!");} //否则提示成功
- }
函数OnConnect()根据定义的IP地址和端口号,调用自定义函数FTPConnect()连接服务器。其中,IP地址和端口号可以由用户进行自定义。以上代码实现了客户端连接服务器的基本功能。