#include"lc.h"
#include "stdlib.h"
#include "stdio.h"
#include <string>
#include <winsock2.h>
#pragma comment(lib,"wsock32.lib")
#include <assert.H>
#include <vector>
#include <string>
#include <fstream.h>
#include <iostream.h>
#include <algorithm>
//#define BUFFER_BLOCK_SIZE 4096;
//UINT SERVER_LISTEN_PORT=21;
char SERVER_IP[16]; //Author's IP, for test. Pls replace it as the FTP Server's IP
char MY_IP[16]="10.2.40.143";
SOCKET commSock;
UINT SERVER_LISTEN_PORT=21;
std::vector<std::string> DIRArray; //All directories in current directory.
std::vector<std::string> FILEArray;//All files in current directory.
std::vector<long> LENGTHArray; //All files length in current directory.
// std::string command;
int retCode;
int DIR();
void PWD();
void TYPEA();
SOCKET PORT(SOCKET listenSock);
BOOL ReceiveList(SOCKET listenSock, BOOL bPrint, BOOL bWaitRetCode);
BOOL ReceiveFile(SOCKET listenSock, const char* filename , BOOL bPrint, BOOL bWaitRetCode);
void RETR(const char* currentDir,const char* filename);
void main()
{
cout<<"open user pass pwd list typea bye"<<endl;
cout<<"ftp>open ";
cin>>SERVER_IP;
WSADATA wsaData;
sockaddr_in serverAddr;
char buffer[4097];
// char ch;
std::string str;
// int code;
BOOL goon=TRUE;
if(WSAStartup(MAKEWORD( 2, 2 ), &wsaData)!=0)
{
cerr<<"socket init error"<<endl;
// return -1;
}
commSock=socket(AF_INET, SOCK_STREAM,0);
serverAddr.sin_addr.s_addr=inet_addr(SERVER_IP);
serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(SERVER_LISTEN_PORT);
if(connect(commSock,(const sockaddr*)&serverAddr,sizeof(sockaddr))==SOCKET_ERROR)
{
cerr<<"connection error!"<<endl;
closesocket(commSock);
// return -1;
}
//1. welcome words
// GetResponseCode(str);
retCode=recv(commSock,buffer,4096,0);
buffer[retCode]='\0';
cout<<"Connected to"<<SERVER_IP<<endl;
cout<<buffer;
cout.flush();
//2. input user name
cout<<"username:";
strcpy(buffer,"USER ");
cin>>buffer+5;
strcat(buffer,"\r\n");
send(commSock,buffer,strlen(buffer),0);
//GetResponseCode();
retCode=recv(commSock,buffer,4096,0);
buffer[retCode]='\0';
cout<<buffer;
cout.flush();
//3. input password
cout<<"password:";
strcpy(buffer,"PASS ");
cin>>buffer+5;
strcat(buffer,"\r\n");
send(commSock,buffer,strlen(buffer),0);
retCode=recv(commSock,buffer,4096,0);
buffer[retCode]='\0';
cout<<buffer;
cout.flush();
while(goon)
{
// std::string command;
std::string str;
char fcommand[4096];
// char command[4096];
char bcommand[4096];
int pos=0;
// int iResult;
// command[4096];
cout<<"lcftp>";
cin>>fcommand>>bcommand;
cout<<fcommand<<endl;
cout<<bcommand<<endl;
//retr
if(strcmp(fcommand,"retr")==0)
{
/*
pos=strlen(fcommand);
char ipos=char(pos);
iResult=sscanf(str.c_str()+pos,"%s",fcommand);
if(iResult==EOF)
{
cout<<"111retr filename/directory"<<endl;
}
*/
if(std::find(FILEArray.begin(),FILEArray.end(),bcommand)!=FILEArray.end())
{
cout<<bcommand;
RETR(".",bcommand);
}
else cout<<"1111out"<<endl;
}
//PWD
if(strcmp(fcommand,"pwd")==0) //返回当前工作目录
{
PWD();
}
if(strcmp(fcommand,"dir")==0) //返回当前工作目录
{
int i;
i=DIR();
}
//LIST
else if(strcmp(fcommand,"list")==0) //返回文件列表
{
// cout<<"list"<<endl;
char buffer[4096];
int retCode;
ifstream file;
SOCKET listenSock;
int sizeAddr=sizeof(sockaddr);
// BOOL bDir;
std::string name;
std::string::size_type pos=0;
BOOL bWaitRetCode=TRUE;
std::string str;
DIRArray.clear();
FILEArray.clear();
LENGTHArray.clear();
PWD();
TYPEA();
listenSock=PORT(listenSock);
strcpy(buffer,"LIST\r\n");
// cout<<buffer;
send(commSock,buffer,strlen(buffer),0);
retCode=recv(commSock,buffer,4096,0);
buffer[retCode]='\0';
cout<<buffer;
cout.flush();
name=buffer;
if(name.find("226")!=std::string::npos)
bWaitRetCode=FALSE;
if(ReceiveList(listenSock, TRUE, bWaitRetCode)==FALSE)
{
cout<<"DIR error"<<endl;
}
retCode=recv(commSock,buffer,4096,0);
buffer[retCode]='\0';
cout<<buffer;
cout.flush();
}
else if(strcmp(fcommand,"port")==0)
{
SOCKET listenSock;
listenSock=PORT(listenSock);
}
//TYPEA
else if(strcmp(fcommand,"typea")==0) //指定数据传输类型
{
TYPEA();
}
else if(strcmp(fcommand,"bye")==0) //断开连接
{
char buffer[4096];
std::string str;
strcpy(buffer,"QUIT\r\n");
send(commSock,buffer,strlen(buffer),0);
retCode=recv(commSock,buffer,4096,0);
buffer[retCode]='\0';
cout<<buffer;
cout.flush();
goon=FALSE;
}
else
{
cout<<"wrong command!"<<endl;
goon=FALSE;
}
}
}
void PWD() //返回当前工作目录
{
char buffer[4096];
std::string str;
strcpy(buffer,"PWD\r\n");
cout<<buffer;
send(commSock,buffer,strlen(buffer),0);
retCode=recv(commSock,buffer,4096,0);
buffer[retCode]='\0';
cout<<buffer;
cout.flush();
}
void TYPEA()
{
char buffer[4096];
std::string str;
strcpy(buffer,"TYPE A\r\n");
// cout<<buffer;
send(commSock,buffer,strlen(buffer),0);
retCode=recv(commSock,buffer,4096,0);
buffer[retCode]='\0';
cout<<buffer;
cout.flush();
}
SOCKET PORT(SOCKET listenSock)
{
char buffer[4096];
int retCode;
std::string ip=MY_IP;
std::string::size_type pos=0;
sockaddr_in localAddr;
int sizeAddr=sizeof(sockaddr);
UINT dataport;
std::string str;
listenSock=socket(AF_INET, SOCK_STREAM,0);
localAddr.sin_addr.s_addr=inet_addr(MY_IP);
localAddr.sin_family=AF_INET;
localAddr.sin_port=htons(0);
if(bind(listenSock,(const struct sockaddr*)& localAddr,sizeAddr)==SOCKET_ERROR)
{
cerr<<"Bind error: "<<GetLastError()<<endl;
return 1;
}
listen(listenSock,5);
getsockname(listenSock,(struct sockaddr*)& localAddr,&sizeAddr);
dataport=ntohs(localAddr.sin_port);
while((pos=ip.find(".", pos))!=std::string::npos)
ip.replace(pos,1, ",");
sprintf(buffer,"PORT %s,%d,%d\r\n",ip.c_str(),dataport/256,dataport%256);
cout<<buffer;
send(commSock,buffer,strlen(buffer),0);
retCode=recv(commSock,buffer,4096,0);
buffer[retCode]='\0';
cout<<buffer;
cout.flush();
return listenSock;
}
BOOL ReceiveList(SOCKET listenSock, BOOL bPrint, BOOL bWaitRetCode)
{
SOCKET clientSock;
sockaddr_in clientAddr;
int sizeAddr=sizeof(sockaddr);
ofstream file;
char buffer[4096];
int retCode;
std::string str;
if((clientSock=accept(listenSock,(struct sockaddr*)&clientAddr,&sizeAddr))==INVALID_SOCKET)
{
cerr<<"Accept error: "<<GetLastError()<<endl;
closesocket(listenSock);
return FALSE;
}
closesocket(listenSock);
while(1)
{
retCode=recv(clientSock,buffer,4096,0);
if(retCode==SOCKET_ERROR)
{
file.close();
closesocket(clientSock);
return FALSE;
}
if(retCode==0)
break;
buffer[retCode]='\0';
if(bPrint)
cout<<buffer;
cout.flush();
}
file.close();
closesocket(clientSock); //it's a end signal
return TRUE;
}
void RETR(const char* currentDir,const char* filename)
{
char buffer[4096];
int retCode;
SOCKET listenSock;
std::string str;
BOOL bWaitRetCode=TRUE;
TYPEA();
listenSock=PORT(listenSock);
sprintf(buffer,"RETR %s\r\n",filename);
cout<<buffer;
send(commSock,buffer,strlen(buffer),0);
retCode=recv(commSock,buffer,4096,0);
评论30
最新资源