3.3.4 获取FTP服务器文件信息(1)
当用户编程时,需要获取FTP服务器文件的列表,以便查看文件的相关信息。在接下来的内容中,将讲解怎样获取FTP服务器文件的相关知识。
(1) 获取文件列表
一般情况下,FTP文件列表信息是通过客户端和服务器端之间的数据通道获取的。编程中,用户可以向服务器发送LIST命令,服务器接收到该命令以后会向客户端返回FTP目录下的文件列表信息。用户需要注意,在PORT模式下传输数据时,客户端需要向服务器提交本地IP地址和用于返回数据的端口号:
CSocket m_Client; //客户端套接字变量
CString m_host; //IP地址字符串变量
UINT nport,port=111; //端口号
m_Client.GetSockName(m_host, nport); //调用函数获得本地的IP地址
m_host.Format(m_host + ",%d", port); //格式化字符串
用户使用PORT命令可以向服务器发送端口号码。格式如"PORT"+string。其中string表示已经格式化的IP和端口字符串。例如下面的代码:m_archive->WriteString("PORT " + m_host + "\r\n");
//调用CArchive类的WriteString()函数发送
m_archive->Flush();
当客户端发送端口之后,必须在该端口上进行监听,以便接受服务器的连接请求。用户需要注意,在服务器和客户端连接关闭以前,服务器均按照此次的IP和端口与客户端进行数据交换。监听代码如下: m_Client.Create(111, SOCK_STREAM, NULL); //创建在111端口上监听的套接字
m_Client.Listen(); //进行监听
此时即可向服务器发送LIST命令获取相关文件的信息,发送LIST命令的代码如下: Try
{ //尝试发送命令LIST到服务器,以获取文件列表
m_archive->WriteString("LIST " + "\r\n");
//调用CArchive类的WriteString()函数发送LIST命令
m_archive->Flush();
}
Catch(CException e)
{ MessageBox("发送关闭命令失败!"); } //抛出错误并处理错误
当用户向服务器发送LIST命令后,服务器会向客户端提供的IP地址和端口号发出连接请求。所以,当客户端在指定端口上监听到连接请求后,应该对该连接进行处理。
在一般情况下,可以将套接字设置为非阻塞模式以避免出现等待状态。当监听套接字检测到有连接请求到来时才响应,否则套接字一直处于监听状态。可以使用AP函数Accept()来响应服务器的连接请求。
例如下面的代码:#define WM_ACCEPT WM_USER+100 //自定义消息,用于响应连接请求
afx_msg void OnAccept(WPARAM wParam, LPARAM lParam) //声明响应连接请求的函数
... //省略部分代码
BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
//{{AFX_MSG_MAP(CMyApp)
//}}AFX_MSG
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
ON_MESSAGE(WM_ACCEPT, OnAccept) //处理消息映射
END_MESSAGE_MAP()
首先需要自定义消息WM_ACCEPT,用于响应连接请求,然后添加消息映射,将自定义消息和实现函数关联起来。在Win32 API中,通过WSAAsyncSelect()函数可以将套接字设置为非阻塞模式,其语法格式如下: int WSAAsyncSelect(SOCKET s, HWND hWnd, int wMsg, long lEvent);
【责任编辑:book TEL:(010)68476606】
点赞 0