FTP服务器(文件访问,文件下载,文件上传)

FTP是什么
FTP(File Transfer Protocol)文件传输协议,用于远程服务器和本地主机之间传输文件。FTP是应用层协议,采用C/S架构,服务器和客户端之间通过TCP协议建立连接,服务器用来存储文件,客户端通过访问服务器来下载文件或向服务器上传文件。
FTP在传输数据的时候使用控制连接(21端口)和数据连接(20端口),控制连接用来传输命令,数据连接用来传输数据;每一个FTP命令发送之后,FTP服务器都会返回一个字符串,包括响应代码和一些说明信息,响应代码主要是判断客户端的命令是否被成功执行。

服务器和客户端之间数据的传输有两种模式:
主动模式(PORT)
1. 客户端和服务器的21端口建立控制连接
2. 客户端发送PORT命令给服务器,PORT命令中包含了客户端将用啥端口接收数据
3. 服务器通过20端口和客户端指定的端口之间传送数据
被动模式(PASV)
1. 客户端和服务器的21端口建立控制连接
2. 客户端向服务器发送PASV命令,服务器在接收到PASV命令之后随机打开一个大于1024的端口,通知客户端在这个端口进行数据的传输
3. 客户端收到这个端口号之后,客户端连接上服务器的这个端口,进行数据传输
4.
FTP的实现:
FTP的基本过程:建立连接,传输数据,释放连接。
socket编程的步骤:

服务器:
socket():创建套接字sock
bind():进行绑定
listen():监听连接的到来
accept():接收新连接的请求
send()和recv():进行会话
close():关闭连接
客户端:
socket():创建套接字sock
connect():给服务器发送一个连接请求
send()和recv():进行会话
close():关闭连接

FTP服务器支持的功能: USER,PASS,LIST,RETR,PUSH,QUIT
FTP服务器的响应码:

220: 新用户服务准备好了
221: 服务关闭控制连接,可以退出登录
226: 关闭数据连接,请求的文件操作成功
230:用户登录
502: 命令未实现,不合法的命令
530:账号或密码错误
550: 未执行请求的操作
553: 未执行请求的操作:文件名不合法

客户端与服务器建立控制连接模块
这里写图片描述
相关函数:
创建一个监听套接字:int socket_create(const char* ip,const int port)
接受连接请求:int socket_accept(int sock)
发送连接请求:int socket_connect(const char* ip,const int port)
从sock中读取数据:int recv_data(int sock,char* buf,int bufsize)
向sock发送响应码:int send_response(int sock,int code)
从标准输入读取一行:void read_input(char *buf,int buffsize)

用户登录模块
使用FTP时必须先登录,在远程主机上获得相应的权限以后,方可上传或下载文件
这里写图片描述
相关函数:
客户端用户登录发送信息函数int ftpclient_login(int sock_ctl)
服务器用户登录接受信息函数int ftpserver_login(int sock_ctl
确认用户信息int ftpserver_check_user(const char* user,const char* pass)

主动模式的数据连接模块
这里写图片描述
当用户信息验证成功之后,客户端调用ftpclient_open_conn()函数创建数据连接,服务器循环接受并解析客户端发来的命令和参数;
1. 客户端先创建一个监听套接字sock_listen,之后给服务器send_response() 发送一个确认,告诉服务器已经创建好了一条数据链路;
2. 这时服务器调用ftpserver_start_data_conn 函数,先收到客户端发来的确认,根据控制端口号调用getpeername 函数获取与某个套接字关联的外地协议地址,调用inet_ntop 函数将ip地址进行转化,最后调用socket_connect 函数发起连接请求

相关函数:
创建数据监听连接:int ftpserver_start_data_conn(int sock_ctl)
发起数据连接请求:int ftpclient_open_conn(int sock_ctl)

访问文件列表模块
这里写图片描述
相关函数:
接收服务器发来的文件信息int ftpclient_list(int sock_ctl,int sock_data)
向客户端发送文件信息int ftpserver_list(int sock_data,int sock_ctl)

文件下载模块
这里写图片描述
相关函数:
void ftpserver_retr(int sock_data,int sock_ctl,char *filename)
int ftpclient_get(int sock_data,char *filename)

文件上传模块
这里写图片描述
相关函数:
void ftpserver_push(int sock_data,int sock_ctl,char* filename)
int ftpclient_put(int sock_data,char *filename)

客户端退出服务器
这里写图片描述