16,548
社区成员




CFtpServer::CFtpServer()
{
}
CFtpServer::~CFtpServer()
{
}
BOOL CFtpServer::Start()
{
if(!Load())
{
cout << "" << endl;
return FALSE;
}
if(!m_sock.Create(21))
{
cout << "ftp socket create error!" << endl;
return FALSE;
}
m_sock.Listen();
CSocket32* pSock = new CSocket32;
while(m_sock.Accept(*pSock))
{
string str = "220 Welcome lqm_ftp";
str += CRLF;
pSock ->Send(str.c_str(),str.size());
OnReceive(pSock);
pSock = new CSocket32;
}
return TRUE;
}
BOOL CFtpServer::Process(CSocket32 *pSock,const string& szCmd,const string& szData)
{
if(szCmd == "USER")
return USER(pSock,szData);
if(szCmd == "PASS")
return PASS(pSock,szData);
return FALSE;
}
void CFtpServer::OnReceive(CSocket32 *pSock)
{
char s[2000];
int nRet = 0;
while((nRet = pSock ->Receive(s,sizeof(s))) > 0)
{
s[nRet] = 0;
string str = s;
int i = str.find(' ');
string szCmd = str.substr(0,i);
string szData = str.substr(i+1,str.size()-3-i);
if(!Process(pSock,szCmd,szData))
break;
}
delete pSock;
}
BOOL CFtpServer::USER(CSocket32 *pSock, const string &szData)
{
string str;
if(!m_map.count(szData))
{
str = "530 User not found!";
str += CRLF;
pSock ->Send(str.c_str(),str.size());
return FALSE;
}
str = "331 Please Pass word";
str += CRLF;
pSock ->Send(str.c_str(),str.size());
return TRUE;
}
BOOL CFtpServer::Load()
{//文件
m_map["test"] = "test";
return TRUE;
}
#include <iostream>
#include <String.h>
#include <winsock2.h>
#include <fstream>
#include <string>
void open(char *serverIP);//连接服务器
void name(char *name);//发送用户名
void password(char *password);//发送密码
void input(char *input);//分离输入的命令和参数
void close();//关闭连接
void ls(char *CmdInput);//显示文件列表
void port(SOCKET *listenSock);//设置端口
void dele(char *filename);//删除文件
void retr(char *filename);//下载文件
void stor(char *filename);//上传文件
WSADATA wsaData;
SOCKET cmdsocket;
char CmdInput[100];
char *Command;
char *Parameter;
void main()
{
cout<<"CYftp>";
input(CmdInput);
if(strcmp(Command,"open")==0)//比较命令,连接服务器
{
open(Parameter);//连接服务器
cout<<"username:";//输入用户名
cin>>CmdInput;
name(CmdInput);//发送用户名
cout<<"password:";//输入密码
cin>>CmdInput;
password(CmdInput);//发送密码
cin.get();
cout<<"ftp>";
input(CmdInput);
}
if(strcmp(Command,"close")==0)//比较命令,调用关闭函数
{
close();
}
if(strcmp(Command,"ls")==0)//比较命令,调用显示文件列表函数
{
ls(CmdInput);
cin.get();
cout<<"ftp>";
input(CmdInput);
dele(Parameter);
}
if(strcmp(Command,"dele")==0)//比较命令,调用删除文件函数
{
dele(Parameter);
ls("ls");
cin.get();
cout<<"ftp>";
input(CmdInput);
}
if(strcmp(Command,"retr")==0)//比较命令,调用下载文件文件函数
{
retr(Parameter);
cin.get();
cout<<"ftp>";
input(CmdInput);
}
if(strcmp(Command,"stor")==0)//比较命令,调用上传文件文件函数
{
stor(Parameter);
ls("ls");
cin.get();
cout<<"ftp>";
input(CmdInput);
}
}
//分离输入的命令和参数
void input(char *input)
{
cin.get(input,100);
Command = strtok(CmdInput," ");
Parameter= strtok(NULL, " " );
}
//连接服务器
void open(char *serverIP)
{
char buf[4096];
int retCode;
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
cout<<"socket init error"<<endl;
}
cmdsocket=socket(AF_INET,SOCK_STREAM,0);
sockaddr_in serveraddr;
serveraddr.sin_addr.s_addr=inet_addr(serverIP);
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(21);
if(connect(cmdsocket,(const sockaddr *)&serveraddr,sizeof(sockaddr))==SOCKET_ERROR)
{
cout<<"connect error!";
closesocket(cmdsocket);
}
retCode=recv(cmdsocket,buf,4096,0);
buf[retCode]='\0';
cout<<buf;
}
//发送用户名
void name(char *name)
{
char buf[4096];
int retCode;
strcpy(buf,"USER ");
strcat(buf,name);
strcat(buf,"\r\n");
send(cmdsocket,buf,strlen(buf),0);
retCode=recv(cmdsocket,buf,4096,0);
if(retCode==SOCKET_ERROR||retCode==0)
{
cout<<"Error!";
}
buf[retCode]='\0';
cout<<buf;
}
//发送密码
void password(char *password)
{
char buf[4096];
int retCode;
strcpy(buf,"PASS ");
strcat(buf,password);
strcat(buf,"\r\n");
send(cmdsocket,buf,strlen(buf),0);
retCode=recv(cmdsocket,buf,4096,0);
if(retCode==SOCKET_ERROR||retCode==0)
{
cout<<"Error!";
}
buf[retCode]='\0';
cout<<buf;
}
//关闭服务器
void close()
{
char buf[4096];
int retCode;
strcpy(buf,"QUIT\r\n");
send(cmdsocket,buf,strlen(buf),0);
retCode=recv(cmdsocket,buf,4096,0);
if(retCode==SOCKET_ERROR||retCode==0)
{
cout<<"Error!";
}
buf[retCode]='\0';
cout<<buf;
}
//显示文件列表
void ls(char *CmdInput)
{
SOCKET listensocket;
SOCKET clientsocket;
sockaddr_in clientaddr;
int sizeaddr=sizeof(sockaddr);
std::string str;
ofstream file;
char buf[4096];
int retCode;
port(&listensocket);
strcpy(buf,"LIST\r\n");
retCode=send(cmdsocket,buf,strlen(buf),0);
retCode=recv(cmdsocket,buf,4096,0);
if(retCode==SOCKET_ERROR||retCode==0)
{
cout<<"Error!";
}
buf[retCode]='\0';
cout<<buf;
clientsocket=accept(listensocket,(struct sockaddr*)&clientaddr,&sizeaddr);
closesocket(listensocket);
str=std::string(".")+"//"+"list.txt";
file.open(str.c_str(),ios::binary);
retCode=recv(clientsocket,buf,4096,0);
file.write(buf,retCode);
buf[retCode]='\0';
cout<<buf;
file.close();
closesocket(clientsocket);
}
//设置端口
void port(SOCKET *listenSock)
{
char buffer[1024];
int retCode;
std::string dip="127.0.0.1";
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("127.0.0.1");
localAddr.sin_family=AF_INET;
localAddr.sin_port=htons(0);
if(bind(*listenSock,(const sockaddr*)& localAddr,sizeAddr)==SOCKET_ERROR)
{
cout<<"监听失败 "<<GetLastError()<<endl;
}
listen(*listenSock,5);
getsockname(*listenSock,(struct sockaddr*)&localAddr,&sizeAddr);
dataport=ntohs(localAddr.sin_port);
while((pos=dip.find(".", pos))!=std::string::npos)
dip.replace(pos,1, ",");
sprintf(buffer,"PORT %s,%d,%d\r\n",dip.c_str(),dataport/256,dataport%256);
retCode=send(cmdsocket,buffer,strlen(buffer),0);
buffer[retCode]='\0';
cout<<buffer;
}
//删除文件
void dele(char *filename)
{
char buf[4096];
int retCode;
strcpy(buf,"DELE ");
strcat(buf,filename);
strcat(buf,"\r\n");
send(cmdsocket,buf,strlen(buf),0);
retCode=recv(cmdsocket,buf,4096,0);
if(retCode==SOCKET_ERROR||retCode==0)
{
cout<<"Error!";
}
buf[retCode]='\0';
cout<<buf;
}
//下载文件
void retr(char *filename)
{
SOCKET listensocket;
SOCKET clientsocket;
sockaddr_in clientaddr;
int sizeaddr=sizeof(sockaddr);
std::string str;
ofstream file;
char buf[4096];
int retCode;
port(&listensocket);
strcpy(buf,"RETR ");
strcat(buf,filename);
strcat(buf,"\r\n");
retCode=send(cmdsocket,buf,strlen(buf),0);
retCode=recv(cmdsocket,buf,4096,0);
if(retCode==SOCKET_ERROR||retCode==0)
{
cout<<"Error!";
}
buf[retCode]='\0';
cout<<buf;
clientsocket=accept(listensocket,(struct sockaddr*)&clientaddr,&sizeaddr);
closesocket(listensocket);
str=std::string(".")+"//"+filename;
file.open(str.c_str(),ios::binary);
retCode=recv(clientsocket,buf,4096,0);
file.write(buf,retCode);
file.close();
closesocket(clientsocket);
}
//上传文件
void stor(char *filename)
{
SOCKET listensocket;
SOCKET clientsocket;
sockaddr_in clientaddr;
int sizeaddr=sizeof(sockaddr);
std::string str;
ifstream file;
filebuf *fb;
int length;
int left;
char buf[4096];
int retCode;
port(&listensocket);
strcpy(buf,"STOR ");
strcat(buf,filename);
strcat(buf,"\r\n");
retCode=send(cmdsocket,buf,strlen(buf),0);
retCode=recv(cmdsocket,buf,4096,0);
if(retCode==SOCKET_ERROR||retCode==0)
{
cout<<"Error!";
}
buf[retCode]='\0';
cout<<buf;
clientsocket=accept(listensocket,(struct sockaddr*)&clientaddr,&sizeaddr);
closesocket(listensocket);
str=std::string(".")+"//"+filename;
file.open(str.c_str(),ios::binary);
fb=file.rdbuf();
length=fb->seekoff(0,ios::end,ios::in)-fb->seekoff(0,ios::beg,ios::in);
left=length;
while(left>0)
{
file.read(buf,4096<left?4096:left);
send(clientsocket,buf,4096<left?4096:left,0);
left-=4096;
cout<<".";
}
cout<<endl;
file.close();
closesocket(clientsocket);
}