ftp文件传输,获取文件大小为零,急求大家帮忙解析,指点下

sledge 2013-07-05 12:06:41
BOOL CFTPclient::MoveFile(CString remotefile, CString localfile,BOOL pasv,BOOL get)
{
CString lhost,temp,rhost;
UINT localsock,serversock,i,j;
CFile datafile;
//侦听服务器的连接
CSocket sockSrvr;
//数据连接通道
CAsyncSocket datachannel;
//接收、发送字节
int num,numread,numsent;
//缓冲区大小
const int BUFSIZE=4096;
//缓冲区
char cbuf[BUFSIZE];
DWORD lpArgument=0;

// 打开本地文件
if(!datafile.Open(localfile,(get?CFile::modeWrite|CFile::modeCreate:CFile::modeRead)))
{
m_retmsg.LoadString(IDS_FTPMSG4);
return FALSE;
}
//二进制传输模式
if(!FTPcommand("TYPE I"))
return FALSE;
//被动接收
if(pasv)
{
if(!FTPcommand("PASV"))
return FALSE;
//获取服务器IP
if((i=m_retmsg.Find("("))==-1||(j=m_retmsg.Find(")"))==-1)
return FALSE;
temp=m_retmsg.Mid(i+1,(j-i)-1);
i=temp.ReverseFind(',');
serversock=atol(temp.Right(temp.GetLength()-(i+1)));
temp=temp.Left(i);
i=temp.ReverseFind(',');
serversock+=256*atol(temp.Right(temp.GetLength()-(i+1))); // add ms byte to server socket
rhost=temp.Left(i);
while(1)
{
//转换
if((i=rhost.Find(","))==-1)
break;
rhost.SetAt(i,'.');
}
}
//主动传输模式
else
{
m_retmsg.LoadString(IDS_FTPMSG6);
//获取本地控制连接IP
if(!m_Ctrlsok->GetSockName(lhost,localsock))
return FALSE;
while(1)
{
//转换
if((i=lhost.Find("."))==-1) break;
lhost.SetAt(i,',');
}
//创建侦听Socket
if((!sockSrvr.Create(0,SOCK_STREAM,NULL))||(!sockSrvr.Listen()))
return FALSE;
if(!sockSrvr.GetSockName(temp,localsock))
return FALSE;
lhost.Format(lhost+",%d,%d",localsock/256,localsock%256);
//发送Port命令
if(!FTPcommand("PORT "+lhost)) return FALSE;
}
if(!WriteStr((get?"RETR ":"STOR ")+remotefile)) return FALSE;
if(pasv)
{
if(!datachannel.Create()) {
m_retmsg.LoadString(IDS_FTPMSG6);
return FALSE;
}
//数据通道连接
datachannel.Connect(rhost,serversock);
}
//获取响应
if(!ReadStr()||m_fc!=1)
return FALSE;
//通道建立
if(!pasv&&!sockSrvr.Accept(datachannel))
return FALSE;
if((!datachannel.AsyncSelect(0))||(!datachannel.IOCtl(FIONBIO,&lpArgument)))
{
m_retmsg.LoadString(IDS_FTPMSG6);
return FALSE;
}
//开始数据传输
while(1)
{
TRY
{
//获取数据
if(get)
{
//传输完毕
if(!(num=datachannel.Receive(cbuf,BUFSIZE,0))||num==SOCKET_ERROR)
break;

else
datafile.Write(cbuf,num);
}
//上传数据
else
{
//传输完毕
if(!(numread=datafile.Read(cbuf,BUFSIZE)))
break;
if((numsent=datachannel.Send(cbuf,numread,0))==SOCKET_ERROR)
break;
//发送的数据少于实际文件,重新定位文件指针
if(numread!=numsent)
datafile.Seek(numsent-numread,CFile::current);
}
}
CATCH (CException,e) {




m_retmsg.LoadString(IDS_FTPMSG5);
return FALSE;
}
END_CATCH
}
//数据通道关闭
datachannel.Close();
datafile.Close();
//获取响应
if(!FTPcommand(""))
return FALSE;
return TRUE;
}
...全文
712 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-07-05
  • 打赏
  • 举报
回复
也许文件大小本来就是0
sledge 2013-07-05
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
FTP Server端升级或打补丁或换另一个厂商提供的软件。 比如Serv-U
我们有专业服务器,现在已经调试提示发送成功但是,问题是现在不能,发送文件其实在服务器上不存在,你这方面很熟悉吗,可否留下QQ聊聊
赵4老师 2013-07-05
  • 打赏
  • 举报
回复
FTP Server端升级或打补丁或换另一个厂商提供的软件。 比如Serv-U
sledge 2013-07-05
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
也许文件大小本来就是0

(000004)2013/7/5 13:29:05 - sledge (192.168.1.102)> PASV
(000004)2013/7/5 13:29:05 - sledge (192.168.1.102)> 227 Entering Passive Mode (192,168,X,X)(ip我略去)
(000004)2013/7/5 13:29:05 - sledge (192.168.1.102)> could not send reply, disconnected.
Filezilla提示这样错误
SecureCRT and SecureFX v7.3.3 x86 x64 build 779 注册破解正式版 2015年3月31日官方正式更新发布! 附带了注册机和注册说明,亲测可用 SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件。SecureCRT支持SSH,同时支持Telnet和rlogin协议。SecureCRT是一款用于连接运行包括Windows、UNIX和VMS的理想工具。通过使用内含的VCP命令行程序可以进行加密文件的传输。有流行CRTTelnet客户机的所有特点,包括:自动注册、对不同主机保持不同的特性、打印功能、颜色设置、可变屏幕尺寸、用户定义的键位图和优良的VT100,VT102,VT220和ANSI竞争.能从命令行中运行或从浏览器中运行.其它特点包括文本手稿、易于使用的工具条、用户的键位图编辑器、可定制的ANSI颜色等.SecureCRT的SSH协议支持DES,3DES和RC4密码和密码与RSA鉴别。 SecureFX 支持三种文件传输协议:FTP、SFTPFTP over SSH2。它可以提供安全文件传输。无论您连接的是任何一种操作系统的服务器,它都能提供安全的传输服务。它主要用于Linux操作系统如redhat, ubuntu的客户端文件传输程序,您可以选择利用SFTP通过加密的SSH2实现安全传输,也可以利用FTP进行标准传输。该客户端具有Explorer风格的界面,易于使用,同时提供强大的自动化能力,可以实现自动化的安全文件传输

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧