FTP客户端C++版Word下载.docx
《FTP客户端C++版Word下载.docx》由会员分享,可在线阅读,更多相关《FTP客户端C++版Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
![FTP客户端C++版Word下载.docx](https://file1.bdocx.com/fileroot1/2022-12/29/b13538ed-5268-490b-921d-b5c0824b7cab/b13538ed-5268-490b-921d-b5c0824b7cab1.gif)
voidsubcommend(string&
filepath,string&
filename);
//输入和转换IP地址
voidstorfile(char*FTPIP);
//上传文件
voidretrfile(char*FTPIP);
//下载文件
voidlistftp(char*FTPIP);
//列出FTP服务器目录
voiddeletefile();
//删除文件
voidquitftp();
//退出客户端
voidhelp();
//帮助
voidabout();
//about
boolishavedetail;
charCmdBuf[MAX_SIZE];
charCommand[MAX_SIZE];
charReplyMsg[MAX_SIZE];
private:
intnReplycode;
boolbConnected;
boolbuser;
SOCKETSocketControl;
SOCKETSocketData;
};
(2)源文件:
FTPClient.cpp
#include"
FTPClient.h"
boolFTPClient:
:
RecvReply()//控制连接接收
{
intnRecv;
memset(ReplyMsg,0,MAX_SIZE);
nRecv=recv(SocketControl,ReplyMsg,MAX_SIZE,0);
if(nRecv==SOCKET_ERROR)
{
cout<
<
"
Socketreceiveerror!
"
<
endl;
closesocket(SocketControl);
returnfalse;
}
//获取相应信息与响应码
if(nRecv>
4){
char*ReplyCodes=newchar[3];
memset(ReplyCodes,0,3);
memcpy(ReplyCodes,ReplyMsg,3);
nReplycode=atoi(ReplyCodes);
returntrue;
}
SendCommand()//向FTP服务器发送命令
//控制连接发送数据
intnSend;
nSend=send(SocketControl,Command,strlen(Command),0);
if(nSend==SOCKET_ERROR){
Socketsenderror!
DataConnect(char*ServerAddr)
//向FTP服务器发送PASV命令
memset(Command,0,MAX_SIZE);
memcpy(Command,"
PASV"
strlen("
));
memcpy(Command+strlen("
),"
\r\n"
2);
if(!
SendCommand())
//获取PASV命令的应答信息
if(RecvReply()){
if(nReplycode!
=227){
cout<
PASVresponseerror!
closesocket(SocketControl);
returnfalse;
}
//分离PASV命令应答信息
char*part[6];
if(strtok(ReplyMsg,"
("
))
for(inti=0;
i<
5;
i++)
{
part[i]=strtok(NULL,"
"
);
if(!
part[i])
returnfalse;
part[5]=strtok(NULL,"
)"
if(!
part[5])
else
//获取FTP服务器数据端口、
unsignedshortServerPort;
ServerPort=unsignedshort((atoi(part[4])<
8)+atoi(part[5]));
//创建数据连接Socket
SocketData=socket(AF_INET,SOCK_STREAM,0);
if(SocketData==INVALID_SOCKET){
Createsocketerror!
//定义Socket地址和端口
sockaddr_inserveraddr2;
memset(&
serveraddr2,0,sizeof(serveraddr2));
serveraddr2.sin_family=AF_INET;
serveraddr2.sin_port=htons(ServerPort);
serveraddr2.sin_addr.S_un.S_addr=inet_addr(ServerAddr);
//向FTP服务器发送Connect请求
intnConnect;
nConnect=connect(SocketData,(sockaddr*)&
serveraddr2,sizeof(serveraddr2));
if(nConnect==SOCKET_ERROR){
endl<
Serverconnecterror!
mkdirectory()//FTP服务器发送MKD命令
ishavedetail){
请输入你要创建的文件夹名:
;
memset(CmdBuf,0,MAX_SIZE);
cin.getline(CmdBuf,MAX_SIZE,'
\n'
MKD"
),CmdBuf,strlen(CmdBuf));
)+strlen(CmdBuf),"
//cout<
Command:
Command<
endl;
//-----------获得MKD命令的应答信息------------------------
if(RecvReply())
if(nReplycode==257)//257:
ReplyMsg<
else
MKDresponseerror!
changedir()//FTP服务器发送CWD命令
ishavedetail)
请输入你要进入的文件夹路径:
CWD"
//-----------获得CWD命令的应答信息------------------------
nReplyCode:
nReplycode<
if(nReplycode==250)//257:
CWDresponseerror!
FTPConnection(char*FTPIP,intport)//建立与Socket库绑定
WSADATAWSAData;
//WSADAT:
WSADATA结构被用来储存调用AfxSocketInit全局函数返回的WindowsSockets初始化信息
if(WSAStartup(MAKEWORD(2,2),&
WSAData)!
=0)//WSAStartup:
初始化当前线程通信环境MAKEWORD:
合并短整数
WSAStartuperror!
//创建控制连接Socket
SocketControl=socket(AF_INET,SOCK_STREAM,0);
if(SocketControl==INVALID_SOCKET)
Creatsocketerror!
sockaddr_inserveraddr;
serveraddr,0,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
//
serveraddr.sin_port=htons(port);
//端口
serveraddr.sin_addr.S_un.S_addr=inet_addr(FTPIP);
//地址
cout<
FTP>
Controlconnect..."
intnConnect=connect(SocketControl,(sockaddr*)&
serveraddr,sizeof(serveraddr));
if(nConnect==SOCKET_ERROR)
//获得Connect应答信息
if(nReplycode==220)
Connetresponseerror!
bConnected=true;
useuser()//向FTP服务器发送USER命令
用户名:
memset(CmdBuf,0,MAX_SIZE);
cin.getline(CmdBuf,MAX_SIZE,'
USER"
Command<
//获得USER命令的应答信息
if(nReplycode==331)//230:
Userloggedin,proceed;
//331:
UserNameokay,needpassword;
USERresponseerror!
buser=true;
usepass()//向FTP服务器发送PASS命令
if(buser)
buser=false;
密码:
cout.flush();
MAX_SIZE;
CmdBuf[i]=getch();
if(CmdBuf[i]=='
\r'
{
CmdBuf[i]='
\0'
break;
}
else
cout<
'
*'
memset(Command,0,MAX_SIZE);
memcpy(Command,"
PASS"
memcpy(Command+strlen("
//获得PASS命令的应答信息
if(RecvReply())
if(nReplycode==230)//230:
PASSrespanseerror!
returntrue;
voidFTPClient:
storfile(char*FTPIP)
请输入上传文件名:
ifstreamf2;
f2.open(CmdBuf,ios:
in);
f2)
Cannotopenfile!
return;
stringstrPath(CmdBuf);
stringfilepath,filename;
intnPos=strPath.rfind('
\\'
if(-1!
=nPos)
filename=strPath.substr(nPos+1,strPath.length()-nPos-1);
filepath=strPath.substr(0,nPos);
filename:
filename<
filepath:
filepath<
memcpy(CmdBuf,filename.data(),strlen(filename.data()));
charFtpStor[MAX_SIZE];
memset(FtpStor,0,MAX_SIZE);
memcpy(FtpStor,FTPIP,strlen(FTPIP));
DataConnect(FtpStor))
STOR"
if(nReplycode==125||nReplycode==150||nReplycode==226)
ReplyMsg;
else{
STORrespanseerror!
return;
charListBuf2[MAX_SIZE];
while(true)
memset(ListBuf2,0,MAX_SIZE);
f2.read(ListBuf2,MAX_SIZE);
intnStor=send(SocketData,ListBuf2,MAX_SIZE,0);
if(nStor==SOCKET_ERROR)
closesocket(SocketData);
break;
f2.close();
closesocket(SocketData);
if(nReplycode==226)
STORresponseerror!
retrfile(char*FTPIP)
请输入下载文件名:
charFtpRetr[MAX_SIZE];
memset(FtpRetr,0,MAX_SIZE);
memcpy(FtpRetr,FTPIP,strlen(FTPIP));
DataConnect(FtpRetr))
RETR"
\r\n