⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myftpsvr.c

📁 linux先ftp客户端,实现文件上传下载,建立目录,实现互联网文件共享
💻 C
字号:
#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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -