3.3.4 获取FTP服务器文件信息(2)
在使用该函数时,应该包含Windows Socket的头文件和相应的库文件。例如下面的代码:
- #include <winsock2.h> //包含Windows Socket头文件
- #pragma comment(lib, "WS2_32.lib") //编译时连接WS2_32库
- ...
在使用函数WSAAsyncSelect()时,参数wMsg表示自定义消息WM_ACCEPT,参数lEvent表示通知码,其取值如表3-7所示。该函数调用成功后,会一直检查通知码,直到指定的网络事件发生,否则将返回0。
表3-7 lEvent取值
|
取 值< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
含 义 |
|
FD_READ |
表示套接字接收到对方发送的数据,
用户可对其进行读取 |
|
FD_WRITE |
通知用户可以继续发送数据 |
|
FD_ACCEPT |
表示套接字上有连接请求到来 |
|
FD_CONNECT |
套接字连接成功 |
|
FD_CLOSE |
套接字检测到对应的连接被关闭 |
因为在此处只检测有无连接请求到来,所以lEvent设置为FD_ACCEPT。例如下面的代码:
- //将套接字设置为非阻塞模式
- ::WSAAsyncSelect(m_Client, m_hSocket, this->m_hWnd, WM_ACCEPT,
- FD_ACCEPT | FD_READ);
当有对应的套接字请求到来时,程序调用自定义消息响应函数进行处理。例如下面的代码: - void OnAccept(WPARAM wParam, LPARAM lParam)
- {
- SOCKET ss;
- sockaddr_in adder;
- char sz[1024] = {0}; //定义缓冲区
- switch(LOWORD(lParam)) //参数lParam的低字节表示通知码
- {
- case FD_ACCEPT: //检测到有连接请求到来
- ss = ::Accept(m_Client.m_hSocket, adder, sizeof(adder));
- //接受到来的连接请求,返回一个临时套接字
- ... //省略部分代码
- case FD_READ:
- ::recv(ss, &sz, 1024, 0); //接收数据到缓冲区
- ...//省略部分代码
- }
- }
当客户端检测到连接请求后,调用函数recv()进行接收,并将数据保存到缓冲区sz中。关于接收到的列表信息如何进行显示等操作将在最后一节实例中讲述。在这里,用户需要注意函数Accept()调用成功后会返回一个临时套接字的句柄。
(2) 获取FTP文件属性
用户发送LIST命令以后,服务器返回信息中包含了文件的一些属性,包括时间、大小等。服务器返回的每条信息都是以"\r\n"结束,在每条信息中以空格分开。
首先,用户需要对缓冲区sz中的数据进行解析,得到一条完整的消息。例如下面的代码:
- char buf[100] = {0}; //用于保存临时数据
- for(int i=0; i<1024; i++) //循环解析消息数据以获得一条完整的信息
- {
- if(sz[i] != "\") buf[i]==sz[i]; //取得的信息不是"\",则保存到临时变量
- else
- {
- if(sz[i+1] == "r") MessageBox("成功解析一条消息!");
- //如果取得的是结束符号,则提示成功提取
- }
- }