大家帮忙看这个函数怎么做?FTP的

xiangxiang626 2005-01-17 12:16:47
int DownOrUpLoad(char* destip, CString SourceName, CString DestName)

FTP上传下载文件的函数,destip为IP,不用初始化,只要能实现文件上传下载就行
...全文
75 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
VCSQLVB 2005-01-18
  • 打赏
  • 举报
回复
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;
}
danielzhu 2005-01-18
  • 打赏
  • 举报
回复
GZ
kingzai 2005-01-17
  • 打赏
  • 举报
回复
uses the MFC class CFtpConnection and CInternetSession to achieve the file transfer
http://www.codeguru.com/Cpp/I-N/internet/ftp/article.php/c6199/
Caps77 2005-01-17
  • 打赏
  • 举报
回复
就一个函数?那可复杂了,要包括ftp的登陆,下载(上传),退出。

http://blog.csdn.net/caps77/

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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