求高手解决ftp服务器
编写FTP服务器:1。 连接协议:
所有ftp协议没有2进制数字,全部用文本格式收发。
发送协议:协议号+描述+CRLF
接收协议:协议键+描述+CRLF
其中,协议号和协议键是关键字,不能随意变换。
#define CRLF “\r\n”
CRLF作为校验使用,因此是必须出现在发送或者接收字串的结尾。
发送长度必须等于strlen或者string.length。发送长度也是校验条件之一。
协议键不区分大小写给以处理。
例如:创建ftp端口21,使用IE浏览器执行登录。
收到Accept连接后立即返回Send1,之后使用Receive接收你将收到Recv2。
依次向下收发,得到的测试结果如下:
Send1=220 127.0.0.1 FtpD for free
Recv2=USER test
Send3=331 Password required for test .
Recv4=PASS test
Send5=230 User test logged in , proceed
Recv6=opts utf8 on
Send7=502 Command OPTS utf8 on not implemented
Recv8=syst
Send9=215 Windows
Recv10=site help
Send11=502 Command SITE help not implemented
Recv12=PWD
Send13=257 "/" is current directory
Recv14=CWD /subing/
Send15=250 "/subing/" is current directory.
Recv16=TYPE A
Send17=200 Type set to ASCII.
Recv18=PASV
Send19=425 Cannot open data connection (192.168.1.13 0 create failed)
Recv20=TYPE A
Send21=200 Type set to ASCII.
Recv22=PORT 127,0,0,1,4,226
Send23=200 Port command okay.
Recv24=LIST
Send25=150 Opening ASCII NO-PRINT mode data connection for ls -l.
2、 协议内容:
每一个协议都是一个判断分支语句,得到是或否的结果再返回(发送)。
1、 Accept:
收到连接请求,根据对方的IP判断是否允许访问。
是:发送220协议,相关描述自定义。
否:关闭Accept产生的收发套接字(socka)。[关闭前也可以发送一条错误信息描述]
2、 USER:
判断描述字符串是否在用户列表中。
是:发送331协议,接续校对密码。
否:发送530协议,登录失败,关闭收发套接字。
3、 PASS:
根据上次收到的USER到用户列表<map>中去超找密码,判断和当前收到的PASS是否一致。
是:发送230协议。
否:发送530协议,登陆失败,关闭收发套接字。
其他协议,在没有完成登录的情况下收到,都不予以处理,返回530错误关闭套接字。
4、 Opts:
5、 Syst:
判断服务器的操作系统环境,返回215协议。
6、 Site:
7、 PWD:
判断FTP根目录是否存在。(例如:D:\FTP\.)
是:发送250协议,根目录可以使用。
否:发送503协议,根目录不能访问。
8、 CWD:
变更当前目录(Change Work Directory)。判断“根目录+子目录”是否存在。
是:发送250协议,当前目录已改变。
否:发送550协议,该目录无法访问。
9、 TYPE:
ftp可以浏览有2种传输格式,文本[A]和二进制格式[I]。
变更或保存对方要求的格式。[等到开始传输时以其中一种格式打开文件]
发送:200协议,格式类型已设置好。
10、 PASV:正向连接模式
创建另个侦听端口:用于接受对方connect,浏览文件信息端口。判断创建侦听端口成功。
成功:发送227协议,例如:Entering Passive Mode (192,168,1,13,4,41)
失败:发送425协议,创建失败。
格式:5个“,”分别代表IP4个段,端口2个段:高位,低位。
Accept产生一个收发端口(pasvSocket),等待发送文件信息。
11、 LIST:
列出文件信息。
发送前:发送150协议,准备开始发送。
发送后:发送226协议,文件信息发送成功。
中间:由pasvSocket连续该目录下所有文件的信息发送,之后关闭pasvSocket。
格式:目录是d,文件是-
Send18=drwxrwxrwx 1 test nogroup 0 Aug 30 02:47 .
Send19=drwxrwxrwx 1 test nogroup 0 Aug 30 02:47 ..
Send20=-rwxrwxrwx 1 test nogroup 9 Aug 30 02:48 Test.txt
12、 NOOP:进入命令模式
发送200协议,Command okay。
13、 DELE:删除文件。
成功:250,失败:553
14、 RNFR:重命名文件开始。
记录OldName后,发送350,Requested new file name。
15、 RNTO:重命名结束:
成功:250,失败:553
16、 MKD:新建文件夹
成功:250,失败:553
17、 RMD:删除文件夹
成功:250,失败:553
18、 STOR:上传文件,
参数:文件名或(带相对路径的文件名)
根据TYPE(I或A)采用2进制或者文本模式,打开绝对路径的文件。
打开成功,使用协议通道(socka)发送150协议,失败发送426返回。
使用数据传输通道(sockt)循环接收数据,并根据接收返回值长度写入文件。
完成后关闭文件,使用协议通道发送226协议。
19、 RETR下载文件
参数:文件名或(带相对路径的文件名)
根据TYPE(I或A)采用2进制或者文本模式,打开绝对路径的文件。
打开成功,使用协议通道(socka)发送150协议,失败发送426返回。
循环读取文件,使用数据传输通道(sockt)根据读取返回值发送读取的数据
完成后关闭文件,使用协议通道发送226协议。
20、 SIZE:获取要下载文件的长度。
参数:文件名或(带相对路径的文件名)
获取按绝对路径的文件,如果文件存在发送213协议,后跟长度数字[描述]。
如果文件不存在也发送213协议,后跟0数字[描述]。
21、 PORT:反连接模式,跟PASV相反的模式
参数:IP和PORT
使用sockt创建0端口,并连接参数中的IP和PORT。
连接成功:发送200协议。 PORT command successful.
连接失败:发送425协议。 Cannot open data connection.