网络工程实训FTI客户机程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第15章

#include
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")
#define MAX_SIZE 4096//定义一个常量值为4096
char CmdBuf[MAX_SIZE];//定义一个MAX-SIZE大小的数组
char Command[MAX_SIZE];//定义一个字符命令
char ReplyMsg[MAX_SIZE];
int nReplyCode;
bool bConnected=false;//设置一个bool变量值为false
SOCKET SocketControl;
SOCKET SocketData;//从服务器接受响应
bool RecvReply()
{//控制连接接收数据
int nRecv;
memset(ReplyMsg,0,MAX_SIZE);
nRecv=recv(SocketControl, ReplyMsg, MAX_SIZE, 0);
if(nRecv==SOCKET_ERROR)
{
cout<<"Socket receive error!"<closesocket(SocketControl);
return false;
}//获得相应信息与响应吗
if (nRecv > 4)
{
char*ReplyCodes=new char[3];
memset (ReplyCodes,0,3);
memcpy (ReplyCodes,ReplyMsg,3);
nReplyCode=atoi(ReplyCodes);
}
return true;
}
//向服务器发送命令
bool SendCommand()
{
//控制连接发送数据
int nSend;
nSend=(SocketControl,Command,strlen(Command),0);
if(nSend==SOCKET_ERROR)
{
cout<<"Socket send error!"<return false;
}
return true;
}
bool DataConnect(char* ServerAddr)
{
//向服务器发送pasv命令
memset(Command,0,MAX_SIZE);
memcpy(Command,"PASV",strlen("PASV"));
memcpy(Command+strlen("PASV"),"\r\n",2);
if(!SendCommand())
return false;
//获取pasv命令的应答信息
if(!RecvReply())
{
if(nReplyCode!=227)
{
cout<<"PASV response error!"<closesocket(SocketControl);
return false;
}
}
//分离pasv命令应答信息
char*part[6];
if(strtok(ReplyMsg,"("))
{
for(int i=0;i<5;i++)
{
part[i]=strtok(NULL,",");
if(!part[i])
return false;
}
part[5]=strtok(NULL,")");
if(!part[5])
return false;
}
else
return false;
//获取服务器数据端口
unsigned short ServerPort;
ServerPort=unsigned short((atoi(part[4])<<8)+atoi(part[5]));
//创建数据连接socket
SocketData=socket(AF_INET,SOCK_STREAM,0);
if(SocketData==INVALID_SOCKET)
{
cout<<"Create socket error!"<return false;
}
//定义socket地址和端口
sockaddr_in serveraddr2;
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);
//向服务器发送connect请求
int nConnect;
nConnect=connect(SocketData,( sockaddr*)& serveraddr2,sizeof(serveraddr2));
if(nConnect== SOCKET_ERROR)
{
cout<return false;
}
return false;
}
void main(int argc,char*argv[])
{
//检查命令行数
if(argc!=2)
{
cout<<"Please input command:FtpClient server_addr"<return;
}
//建立与socket库的绑定
WSADATA WSAData;
if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)
{
cout<<"WSASt

artup error!"<return;
}
//创建控制连接socket
SocketControl=socket(AF_INET,SOCK_STREAM,0);
if(SocketControl==INVALID_SOCKET)
{
cout<<"Create socket error!"<return;
}//定义socket地址和端口
sockaddr_in serveraddr;
memset(&serveraddr,0,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(21);
serveraddr.sin_addr.S_un.S_addr=inet_addr(argv[1]);//向服务器发送connect请求
cout<<"FTP>Control Connect...";
int nConnect;
nConnect=connect(SocketControl,( sockaddr*)& serveraddr,sizeof(serveraddr));
if(nConnect== SOCKET_ERROR)
{
cout<return;
}
//获得connect应答信息
if(RecvReply())
{
if(nReplyCode==220)
cout<else
{
cout<<"Connect response error!"<closesocket(SocketControl);
return;
}
}
//向服务器发送user命令
cout<<"FTP>USER:";
memset(CmdBuf,0,MAX_SIZE);
cin.getline(CmdBuf,MAX_SIZE,'\n');
memset(Command,0,MAX_SIZE);
memcpy(Command,"USER",strlen("USER"));
memcpy(Command+strlen("USER"),CmdBuf,strlen(CmdBuf));
memcpy(Command+strlen("USER")+strlen(CmdBuf),"\r\n",2);
if(!SendCommand())
return;
//获得user命令的应答信息
if(RecvReply())
{
if(nReplyCode==230||nReplyCode==331)
cout<else
{
cout<<"USER response error!"<closesocket(SocketControl);
return;
}
}

if(nReplyCode==331)
{
//向服务器发送pass的命令
cout<<"FTP>PASS:";
memset(CmdBuf,0,MAX_SIZE);
cout.flush();
for(int i=0;i{
CmdBuf[i]=getch();
if(CmdBuf[i]=='\r')
{
CmdBuf[i]='\0';
break;
}
else
cout<<'*';
}
memset(Command,0,MAX_SIZE);
memcpy(Command,"PASS",strlen("PASS"));
memcpy(Command+strlen("PASS"),CmdBuf,strlen(CmdBuf));
memcpy(Command+strlen("PASS")+strlen (CmdBuf),"\r\n",2);
if(!SendCommand())
return;
//获得pass命令的应答信息
if(RecvReply())
{
if(nReplyCode==230)
cout<else
{
cout<<"PASS response error!"<closesocket(SocketControl);
return;
}
}
}
//向服务器发送list命令
cout<<"FTP>LIST"<char FtpServer[MAX_SIZE];
memset(FtpServer,0,MAX_SIZE);
memcpy (FtpServer,argv[1],strlen(argv[1]));
if(!DataConnect(FtpServer))
return;
memset(Command,0,MAX_SIZE);
memcpy(Command,"LIST",strlen("LIST"));
memcpy(Command+strlen("LIST"),"\r\n",2);
if(!SendCommand())
return;
//获得list命令的应答信息
if(RecvReply())
{
if(nReplyCode==125||nReplyCode==150||nReplyCode==226)
cout<else
{
cout<<"LIST response error!"<closesocket(SocketControl);
return;
}
}
//获得list命令的目录信息
int nRecv;
char ListBuf[MAX_SIZE];
while(true)
{
memset(ListBuf,0,MAX_SIZE);
nRecv=recv(SocketData,ListBuf,MAX_SIZE,0);
if(nRecv==SOCKET_ERROR)
{
cout<

l<<"socket receive error!"<closesocket(SocketData);
return;
}
if(nRecv<=0)
break;
cout<}
closesocket(SocketData);
//获得list命令的应答信息
if(RecvReply())
{
if(nReplyCode==226)
cout<else
{
cout<<"LIST response error!"<closesocket(SocketControl);
return;
}
}
//向用户发送quit命令
cout<<"FTP>QUIT"<memset(Command,0,MAX_SIZE);
memcpy(Command,"QUIT",strlen("QUIT"));
memcpy(Command+ strlen("QUIT"),"\r\n",2);
if(!SendCommand())
return;
//获得quit的应答信息
if(RecvReply())
{
if(nReplyCode==221)
{
cout<bConnected=false;
closesocket(SocketControl);
return;
}
else
{
cout<closesocket(SocketControl);
return;
}
}
WSACleanup();
}




相关文档
最新文档