2016-01-05 19:46:22|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 网络通信|来源:唯设编程网
int CFTP::ftp_download( const char* localfile,const char* remotefile,size_t buf_size /*= 1024*/ )
{
ftp_setpasv();
sprintf_s(m_cmd,"RETR %s
",remotefile);
int err = ftp_sendcmd(m_cmd,m_resp,sizeof(m_resp));
if(err)
return -1;
//得到返回码
int code = get_state_code(m_resp);
//125 Data connection already open; Transfer starting.
//150 Open BINARY mode data connection for test.step
if(code != 125 && code != 150)
return -1;
//检测本地目录是否存在,不存在则创建目录
std::string localPath(localfile);
int iRet = access(localPath.substr(0,localPath.rfind("")).c_str(),0);
if(iRet){
local_create_dir(localPath.substr(0,localPath.rfind("")).c_str());
}
//本地文件
FILE* pf = NULL;
//二进制方式打开
errno_t s_code = fopen_s(&pf,localfile,"wb");
if(NULL==pf)
return -1;
char* recvbuf = new char[buf_size];
memset(recvbuf,0,buf_size);
int len = 0;
while((len = recv(m_sockdata,recvbuf,buf_size,0))>0)
{
err = fwrite(recvbuf,len,1,pf);
if(err<0)
return -1;
}
//删除缓存空间
delete []recvbuf;
closesocket(m_sockdata);
fclose(pf);
//226 Transfer complete.
err = recv_buf(m_resp,sizeof(m_resp));
if(err || get_state_code(m_resp) != 226)
return -1;
return 0;
}
下载FTP文件使用的命令是RETR。
size_t CFTP::ftp_getFileSize( const char* remoteFileName )
{
sprintf_s(m_cmd,"SIZE %s
",remoteFileName);
int err = ftp_sendcmd(m_cmd,m_resp,sizeof(m_resp));
if(err)
return 0;
size_t fileSize = 0; //文件大小
int code = -1; //返回码
//分离出字符串
std::string s(m_resp);
std::istringstream ss(s); //拷贝构造输出串流
ss>>code>>fileSize;
//213 103708394
if(code == 213)
return fileSize;
return 0;
}
使用SIZE命令可以获取FTP指定文件的大小。
到此所有CFTP类的成员函数就介绍完毕了,本文作为一个示例程序,旨在介绍FTP传输的基本原理,效率方面有待优化,也没有使用多线程,欢迎各位多多不吝赐教,多多批评指正。
转载请保留出处:C++实现的FTP案例代码解析