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

📄 ftpmain.c

📁 linux下的FTP服务器。支持现在主流的FTP客户端软件。增加了一些额外的功能。
💻 C
字号:
#include "Public.h"
#include "Ftpcmd.h"
#include "DaemonMgr.h"


// 初始化ftp全局变量函数
void InitGobalVar(int ctrsokcfd)
{
	memset(&ftp_global_var,0,sizeof(ftp_global_var));
	ftp_global_var.CtrSockfd = ctrsokcfd; // 控制链接
	ftp_global_var.IsLogin = 0; // 开始没有登入
	memset(ftp_global_var.username,0,sizeof(ftp_global_var.username));// 用户名初始化
	ftp_global_var.isanonymous =0;// 
}

// 服务器响应函数
void ServiceEcho(int numcode,char * msg)
{
	char temp[80];
	memset(temp,0,80);
	sprintf(temp,"%d  %s.\r\n",numcode,msg);
	write_loop(ftp_global_var.CtrSockfd,temp,strlen(temp));
}


// 命令解析函数
/***********************************************************
	char * command 命令行
	char * cmd 命令
	char * param 命令的参数字符串
	sample: user -b -> cmd=user param=-b;
*************************************************************/
void ToDo_ParseCommand(char * command,char *cmd,char * param)
{
	int i=0;
	int len=strlen(command);
	int isparam=0;
	for(i=0;i<len;i++)
	{
		if(command[i]==' ')
		{
			strncpy(cmd,command,i);
			cmd[i+1]='\0';
			strncpy(param,&command[i+1],len-i);
			isparam=1; // 有参数
			break;
		}
	}
	// 分割后去除左右空格
	if (!isparam)
	{
		// 没有参数的情况
		strncpy(cmd,command,i);
		cmd[len-1]='\0';
		param =NULL;
	}else
	{
		// 有参数 // 去除\r\n
		len=strlen(param);
		param[len-1]='\0';
		MoveSpace(param);
	}
	MoveSpace(cmd);
}


/**********************************************
	 命令请求 - 查找命令相对应的命令处理函数
***********************************************/
void ToDo_CommandRequest(char * command)
{
	MoveSpace(command);
	int len=strlen(command);

	if (len==0)
	{
		// 空命令
	}
	
	char cmd[12]={0};
	char param[40]={0};

	ToDo_ParseCommand(command,cmd,param);// 分割命令为 命令段 参数段
	int index=0;
	int foundflag=0;

	while( cmd_list[index].cmd !=NULL )
	{
		if (strcasecmp(cmd_list[index].cmd,cmd)==0)
		{
			if (cmd_list[index].cmd_handler == NULL)
			{
				// 没有命令处理函数
				//ServiceEcho(502,"命令没有处理函数");
				ServiceEcho(500,"Unknown command HANDLER ==NULL");

			}
			else
			{
				// 调用命令处理函数

				(*cmd_list[index].cmd_handler)(param);
			}
			foundflag=1;
			break;
		}
		index++;
	}

	if (0 == foundflag)
	{
		// 说明不存在该命令
		ServiceEcho(500,"Unknown command");
	}
}


/*************************************************
	处理控制链接函数 -- 读取从客户端发送来的命令
**************************************************/
int ToDo_CtrConect(int conectfd)
{
	// 初始化FTP全局变量
	InitGobalVar(conectfd);
	// 服务器响应 连接成功

	ServiceEcho(220,ftp_config.service_name);

	char reccommand[512];
	memset(reccommand,0,512);

	int len=1;
	while (1)
	{

		// 超时的情况 还没有考虑,超时的情况应该用select 来搞
		//   ????????
		
		len=readline(conectfd,reccommand,512);
		//read(conectfd,reccommand,512);
		if (len<=0)
		{
			// 没有读到,或者读错误了。
		}else
		{
			ToDo_CommandRequest(reccommand);
		}
	}
	return 0;
}


/*****************************************************
		服务器主函数
*******************************************************/
void  start(void)
{
	
	// 读取配置文件
	Read_Config("MyFtp.conf",&ftp_config);
	


	Create_shm((key_t )1234,sizeof(struct shared_count),IPC_CREAT | 0666);

	int listenfd;
	int CtlConnectFd;
	struct sockaddr cliaddr;
	socklen_t clilen=sizeof(cliaddr);

	listenfd = Tcp_service(INADDR_ANY,ftp_config.ctrl_connect_port); // 5555 端口  初始化 绑定
	// 测试阶段服务器监听 用 5555 端口
	
	Tcp_listen(listenfd,MAX_CONNECT_COUNT);
	while (1)
	{
		CtlConnectFd = Tcp_accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);
	
		if (fork()==0)
		{	// 启动的时候,(控制链接)马上链接 CtlConnect
			// 子进程  
			close(listenfd);
			// to do 子进程的处理工作
			// 处理控制链接 控制一直都连接着 占用这端口

			ToDo_CtrConect(CtlConnectFd);
			close(CtlConnectFd);
			exit(0); // 子进程退出
		}
		close(CtlConnectFd);
	}
}


/************************************************
	主函数
*************************************************/
int main(int argc, char *argv[])
{
	daemon_ctrl(argc, argv,start);
	return 0;
}

⌨️ 快捷键说明

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