📄 ftpmain.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 + -