20190607miniftp

为什么绝对不能使用多线程来实现。因为多个线程共享同一个工作目录。
而进程之间是相互独立的。
IO复用也不允许。IO复用是用单线程处理多个线程的连接,所以使用的是多进程来实现的。

1、如果以ASCII方式来传输文件,并且从windows->linux会将\r\n转换为\n
从linux->windows会将\n转换为\r\n
2、二进制传输不做任何解析,保留不变。

主动模式
1、客户端向服务器端发送port命令
客户端创建数据套接字
客户端绑定一个临时端口
客户端在套接字上监听
将IP与端口格式化为h1,h2,h3,h4,p1,p2
2、服务器端以200相应
服务器端解析客户端发过来的IP与端口暂存起来,一边后续建立数据连接
3、客户端向服务器端发送LIST
服务器端检测到LIST命令之前是否接收过PORT或者PACV命令
如果没有接收过,则相应425 Use PORT or PASV first
如果有接收过,并且是PORT,则服务器端创建数据套接字(bind 20端口),调用connect主动连接客户端IP与端口,从而建立了数据连接。
4、服务发送150应答给客户端,表示准备就绪,可以开始传输了
5、开始传输列表
6、服务器发送226应答给客户端,表示数据传输结束
传输结束,服务器端主动关闭数据套接字

被动模式
1、客户端向服务器端发送PASV命令
2、服务器以227响应
服务器端创建数据套接字
服务器端绑定一个临时端口
服务器在套接字上监听
将IP与端口格式化为h1,h2,h3,h4,p1,p2响应给客户端,以便客户端发起数据连接
3、客户端向服务器发送LIST
服务器端检测在收到LIST命令之前是否接受过PORT或PASV命令
如果没有接收过,则响应425 Use PORT or PASV first
如果有接收过,并且是PASV,则调用accept被动接收客户端的连接,返回已连接套接字
,从而建立的数据连接。
4、服务发送150应答给客户端,表示准备就绪,可以开始传输了
5、开始传输列表
6、服务器发送226应答给客户端,表示数据传输结束
传输结束,客户端主动关闭数据套接字
数据连接

发布了39 篇原创文章 · 获赞 10 · 访问量 766

猜你喜欢

转载自blog.csdn.net/weixin_43393776/article/details/91128997