用客户端登录服务器:
连接一下我们暂时实现的miniftpd,看看效果:
首先,启动miniftpd:./miniftpd
连接miniftpd:
接下来实现它,与协议相关的模块都是在ftpproto.c中完成的,目前的代码如下:
#include"ftpproto.h"
#include"sysutil.h"
#include "str.h"
void handle_child(session_t *sess)
{
writen(sess->ctrl_fd, "220 (miniftp 0.1)\r\n", strlen("220 (miniftp 0.1)\r\n"));
int ret;
while(1)
{
memset(sess->cmdline, 0, sizeof(sess->cmdline));
memset(sess->cmd, 0, sizeof(sess->cmd));
memset(sess->arg, 0, sizeof(sess->arg));
ret = readline(sess->ctrl_fd, sess->cmdline, MAX_COMMAND_LINE);
if (ret == -1)
{
ERR_EXIT("readline");
}
else if (ret == 0)
exit(EXIT_SUCCESS);
printf("cmdline=[%s]\n", sess->cmdline);
//去除/r/n
str_trim_crlf(sess->cmdline);
printf("cmdline=[%s]\n", sess->cmdline);
//解析FTP命令与参数
str_split(sess->cmdline, sess->cmd, sess->arg, ' ');
printf("cmd=[%s] arg=[%s]\n", sess->cmd, sess->arg);
//将命令转换成大写
str_upper(sess->cmd);
//处理FTP命令
}
}
在上面的模块中,连接miniftpd后,进行的相关操作为:
1、打印出第一条响应:220 (miniftp 0.1)
2、不断读取命令行参数
3、去除去除/r/n
4、解析FTP命令与参数
5、将命令转换成大写
6、处理FTP命令
接下来,我们来处理FTP命令,主要实现do_user和do_pass函数:
由于这两个函数只用于ftpproto模块,因此,我们将其声明为static:
#include "ftpproto.h"
#include "sysutil.h"
#include "str.h"
static void do_user(session_t *sess);
static void do_pass(session_t *sess);
void handle_child(session_t *sess)
{
writen(sess->ctrl_fd, "220 (miniftpd 0.1)\r\n", strlen("220 (miniftpd 0.1)\r\n"));
int ret;
while (1)
{
memset(sess->cmdline, 0, sizeof(sess->cmdline));
memset(sess->cmd, 0, sizeof(sess->cmd));
memset(sess->arg, 0, sizeof(sess->arg));
ret = readline(sess->ctrl_fd, sess->cmdline, MAX_COMMAND_LINE);
if (ret == -1)
ERR_EXIT("readline");
else if (ret == 0)
exit(EXIT_SUCCESS);
printf("cmdline=[%s]\n", sess->cmdline);
// 去除\r\n
str_trim_crlf(sess->cmdline);
printf("cmdline=[%s]\n", sess->cmdline);
// 解析FTP命令与参数
str_split(sess->cmdline, sess->cmd, sess->arg, '