2019-06-15

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)

客户端退出服务器

--------欧米网络

提供作者:Emily静

来源:CSDN

原文:https://blog.csdn.net/qq_39295755/article/details/81536874

你可能感兴趣的:(2019-06-15)