#include "MyFtpSvr.h"
char g_szSvrMsg[64]={0}; //消息字符串
char g_path[24]={0}; //当前目录
char g_IpAdd[15]={0}; //IP地址字符串
int g_sockData; //数据连接套接字
int main()
{
int sockSvr,sockControl;
pid_t pid;
int iDataPort;
char *FilePath=NULL;
//主进程等待客户端连接,有连接就创建子进程处理客户端请求
//捕捉子进程退出代码,防止产生僵尸进程
signal(SIGCHLD,ChildExitHandler);
sockSvr=TcpSvrInit(2121);
while(1)
{
sockControl=accept(sockSvr,NULL,NULL);
pid=fork();
if(pid<0)
{
perror("fork faild");
}
else if(pid==0)
{
close(sockSvr);
//服务器初始化,用户登陆,确定用户登陆目录
FtpInit(sockControl,g_path);
while(1)
{
memset(g_szSvrMsg,'\0',sizeof(g_szSvrMsg));
Recv(sockControl,g_szSvrMsg,sizeof(g_szSvrMsg),0);
//PASV工作模式
if(strcmp(g_szSvrMsg,"PASV\r\n")==0)
{
//建立PASV数据连接
g_sockData=PasvDataConnection_Create(sockControl);
memset(g_szSvrMsg,'\0',sizeof(g_szSvrMsg));
Recv(sockControl,g_szSvrMsg,sizeof(g_szSvrMsg),0);
}
//PORT工作模式
if(memcmp(g_szSvrMsg,"PORT",4)==0)
{
memset(g_IpAdd,'\0',sizeof(g_IpAdd));
//从客户端发来的信息中提取IP地址和端口号
iDataPort=StrToPort(g_szSvrMsg,g_IpAdd);
strcpy(g_szSvrMsg,"200 PORT command successful. Consider using PASV.\r\n");
Send(sockControl,g_szSvrMsg,strlen(g_szSvrMsg),0);
memset(g_szSvrMsg,'\0',sizeof(g_szSvrMsg));
Recv(sockControl,g_szSvrMsg,sizeof(g_szSvrMsg),0);
//建立PORT数据连接
g_sockData=PortDataConnection_Create(iDataPort,g_IpAdd);
}
//处理客户端上传普通文件请求
if(memcmp(g_szSvrMsg,"STOR",4)==0)
{
UpLoadRegFile(g_szSvrMsg,sockControl,g_sockData);
printf("Upload regular file done!\n");
//关闭数据连接
DataConnection_Close(g_sockData);
}
//处理客户端下载普通文件请求
if(memcmp(g_szSvrMsg,"RETR",4)==0)
{
DownLoadRegFile(g_szSvrMsg,sockControl,g_sockData);
printf("Download regular file done!\n");
//关闭数据连接
DataConnection_Close(g_sockData);
}
//处理客户端刷新请求
if(strcmp(g_szSvrMsg,"LIST\r\n")==0)
{
Pasv_List(sockControl,g_sockData,g_path);
printf("Client Refresh!\n");
//关闭数据连接
DataConnection_Close(g_sockData);
}
//处理客户端上传目录文件请求
if(memcmp(g_szSvrMsg,"MKD",3)==0)
{
UpLoadDirFile(g_szSvrMsg,sockControl);
printf("UpLoad directory file done!\n");
}
//处理客户端删除文件的请求
if(memcmp(g_szSvrMsg,"DELE",4)==0)
{
DeleRegFile(g_szSvrMsg,sockControl);
printf("Delete regular file done!\n");
}
//处理客户端删除目录请求
if(memcmp(g_szSvrMsg,"RMD",3)==0)
{
DeleDirFile(g_szSvrMsg,sockControl);
printf("Delete directory file done!\n");
}
//处理客户端NOOP请求
if(memcmp(g_szSvrMsg,"NOOP",4)==0)
{
strcpy(g_szSvrMsg,"200 NOOP ok.\r\n");
Send(sockControl,g_szSvrMsg,strlen(g_szSvrMsg),0);
}
//处理客户端CWD请求
if(strcmp(g_szSvrMsg,"CWD\r\n")==0)
{
strcpy(g_szSvrMsg,"257 \"/home/aaa\"\r\n");
Send(sockControl,g_szSvrMsg,strlen(g_szSvrMsg),0);
memset(g_szSvrMsg,'\0',sizeof(g_szSvrMsg));
}
//处理客户端TYPE I请求
if(strcmp(g_szSvrMsg,"TYPE I\r\n")==0)
{
strcpy(g_szSvrMsg,"200 Switching to Binary mode.\r\n");
Send(sockControl,g_szSvrMsg,strlen(g_szSvrMsg),0);
}
//处理客户端TYPE A请求
if(strcmp(g_szSvrMsg,"TYPE A\r\n")==0)
{
strcpy(g_szSvrMsg,"200 Switching to ASCII mode.\r\n");
Send(sockControl,g_szSvrMsg,strlen(g_szSvrMsg),0);
}
//处理客户端CWD /path请求
if(memcmp(g_szSvrMsg,"CWD",3)==0)
{
FilePath=FindFilePath(g_szSvrMsg);
strcpy(g_path,FilePath);
strcpy(g_szSvrMsg,"250 Directory successfully changed.\r\n");
Send(sockControl,g_szSvrMsg,strlen(g_szSvrMsg),0);
}
//处理客户端PWD请求
if(strcmp(g_szSvrMsg,"PWD\r\n")==0)
{
strcpy(g_szSvrMsg,"257 \"");
strcat(g_szSvrMsg,g_path);
strcat(g_szSvrMsg,"\"\r\n");
Send(sockControl,g_szSvrMsg,strlen(g_szSvrMsg),0);
}
//处理客户端REST 0请求
if(strcmp(g_szSvrMsg,"REST 0\r\n")==0)
{
strcpy(g_szSvrMsg,"350 Restart position accepted(0)\r\n");
Send(sockControl,g_szSvrMsg,strlen(g_szSvrMsg),0);
}
//处理客户端REST 100请求
if(strcmp(g_szSvrMsg,"REST 100\r\n")==0)
{
strcpy(g_szSvrMsg,"350 Restart position accepted(100)\r\n");
Send(sockControl,g_szSvrMsg,strlen(g_szSvrMsg),0);
}
//处理客户端QUIT请求
if(strcmp(g_szSvrMsg,"QUIT\r\n")==0)
{
strcpy(g_szSvrMsg,"221 Goodbye.\r\n");
Send(sockControl,g_szSvrMsg,strlen(g_szSvrMsg),0);
exit(0);
}
}
}
else if(pid>0)
{
//主进程关闭控制信息通道
close(sockControl);
}
}
return 0;
}