(200分求救)用socket API获取FTP服务器文件列表
至于如何获取大家都清楚,发送几个命令(主动 PORT LIST 与被动方式 PASV)
我仅用主动模式获取服务器的返回列表信息
参考了下别人源代码,用MFC封装类写的
///////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 函数:BOOL CFTPClient::List ()
//
// 描述:
// 列出当前文件信息,在下面函数里对信息进行了解析(就是分析字符串啦)
//
// 参数:
// -无
// 返回:
// -BOOL 成功返回 TRUE 否则返回 FALSE
//
//
///////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CFTPClient::List ()
{
CSocket sServ;//用于侦听
CAsyncSocket asDataChannel; //用于接收数据
CString strCommand;//发送的命令
CString strAdress;//本机地址
UINT nListenPort ; //侦听的端口号
//开始侦听 这个要在发送命令之前,否则出错
if (!(sServ.Create (0,SOCK_STREAM,NULL))||(!sServ.Listen ()))
{
return FALSE;
}
sServ.GetSockName(strAdress,nListenPort);
UINT temp;
//在连接时设置了用户的IP,因此要从这里得到你现在作用的IP地址,而不要从注释的方式得到
//sServ.GetSockName(strAdress,nListenPort);
this->m_pSocket->GetSockName (strAdress,temp);
/******这里是(主动模式)发送PORT, TYPE I, LIST命令给服务器*****/
//接受服务器的联接
if (!sServ.Accept (asDataChannel ))
return FALSE;
DWORD lpArgument = 0;
int num,sum;
//定义缓冲区的大小'
const int BUFSIZE = 4096;
//清空缓冲区
this->m_btBuf.RemoveAll ();
this->m_btBuf.SetSize (BUFSIZE);
//获取数据
if ((!asDataChannel.AsyncSelect (0))||(!asDataChannel.IOCtl (FIONBIO,&lpArgument)))
{
return FALSE;
}
//获取数据
sum = 0;
while (1)//在这里没有循环结束条件
{
TRY
{
if (!(num = asDataChannel.Receive (this->m_btBuf.GetData() + sum,BUFSIZE,0)||(num == SOCKET_ERROR)))
break;
//sleep(0);
sum += num;
this->m_btBuf.SetSize (sum+BUFSIZE);
}
CATCH(CException,e)
{
return FALSE;
}
END_CATCH
}
asDataChannel.Close ();
::AfxMessageBox(CString((LPCTSTR)this->m_btBuf.GetData()));
}
他的代码很好懂(CAsyncSocket是不堵塞的,所以他可以一直就这样用是吧)
下面我模仿着他的代码自己用SOCKET API写了下:
下面是我的代码: