请教FTP问题(100分)

  • 主题发起人 主题发起人 DDMike
  • 开始时间 开始时间
D

DDMike

Unregistered / Unconfirmed
GUEST, unregistred user!
我用WINSOCK编写FTP客户端时,用异步方式后并使用Connect后,服务器返回如下信息
220------------------------------------------------
Dmeserver FTP 现只对CERNET开放
由清华大学机械工程系科协管理
28# 楼内可以通过网上邻居连接
注意:清华,北大,中科院使用21端口(down:500kps,up:600kps)
其他用户请使用8021端口(down:200kps,up:400kps)
对教育网内大部分高校均开放
如果您有需要而IP不在访问之列,请 mailto:
gw000000@sina.com
为保证服务器速度,请勿反复多线程连接
请勿上传反动、不健康内容,谢谢合作
^^^
[通知:本服务器将于1月15日至2月15号间关闭中转服务]
^^^
-----------------------------------------------
220 DMEServer FTP server ready.
程序中我判断的是返回字串的前3位,如果是220则Connect结束,执行下一命令
USER,但由于第一行就返回了220,因此成了如下结果
Connect...
220------------------------------------------------
USER yy
Dmeserver FTP 现只对CERNET开放
由清华大学机械工程系科协管理
28# 楼内可以通过网上邻居连接
注意:清华,北大,中科院使用21端口(down:500kps,up:600kps)
其他用户请使用8021端口(down:200kps,up:400kps)
对教育网内大部分高校均开放
如果您有需要而IP不在访问之列,请 mailto:
gw000000@sina.com
为保证服务器速度,请勿反复多线程连接
请勿上传反动、不健康内容,谢谢合作
^^^
[通知:本服务器将于1月15日至2月15号间关闭中转服务]
^^^
-----------------------------------------------
220 DMEServer FTP server ready.
[red]请问我如何知道服务器返回的信息是结束?[/[/red]b][black]即如下结果:
[red]Connect...[/red]220------------------------------------------------
Dmeserver FTP 现只对CERNET开放
由清华大学机械工程系科协管理
28# 楼内可以通过网上邻居连接
注意:清华,北大,中科院使用21端口(down:500kps,up:600kps)
其他用户请使用8021端口(down:200kps,up:400kps)
对教育网内大部分高校均开放
如果您有需要而IP不在访问之列,请 mailto:
gw000000@sina.com
为保证服务器速度,请勿反复多线程连接
请勿上传反动、不健康内容,谢谢合作
^^^
[通知:本服务器将于1月15日至2月15号间关闭中转服务]
^^^
-----------------------------------------------
220 DMEServer FTP server ready.
[redUSER yy[/red][/black]
请各位多多指教?
 
你先手工连接看一看服务器返回的信息,比如你上面的那样结束标志就是:[red]220 DMEServer FTP server ready.[/red]
这样可能不同的服务器要不同处理,所以你可以比较一下不同的服务器返回的信息中有哪些共同的信息,然后判断。
其实邮件服务有它的协议,最好按协议来做,否则就会出问题或走弯路
 
先看服务器返回的信息再编程实现肯定不现实,LeapFtp,CuteFtp都不是这样实现的,
除了Connect,当发送User后,有的服务器也会返回一系列信息,又如何解决?
 
你最好找到ftp协议看一看。另外不知你为何要使用异步方式呢?使用同步方式是不是就可以防止这种情况发生?
 
这与FTP协议无关,因为返回码220表示连接成功了,但返回字串并不是一次返回全部信息。
服务器并无特别标志表明Connect结束。另外:用同步和异步在这里是一样。用异步的方式
主要是我程序中在等待中还可以做其他操作如:中断等待。
 
其实很简单啊,220判断连接成功没错,但你不能从此停止读取,只有当读到空行的时候
才要求用户输入就行了。
(很奇怪,为什么要用异步连接呢?ftp客户端本身的交互方式就是同步方式的,服务端可以
做异步,但客户端做异步怎么做呢,我很奇怪。如上面所说,你必须阻塞客户端直到服务端
结束写入为止才行的。)
 
补充一下,你应该看一下rfc959,里面详细的规定了客户端和服务端交互的方式。
 
客户端用异步方式,主要目的是让程序在与服务交换信息时可以做其他事情,如中断等待
、变换本地目录等(CuteFTP,LeapFTP都用的异步方式)。
关于读取空行我不太明白。我程序中是这样做的:Recv后找到#13#10,有就表示该行结束
同时返回码为220表示Connect结束。但由于有些服务器返回多行且又没有明显的结束标识
,我就无法判断Connect命令是否完成。有的服务器在USER后也会返回多行。 在FD_READ:
中如没有数据根本不会触发该事件。

 
看来我理解的异步跟你所说的异步不太一样,呵呵,这几天看java nio看晕了。
你与服务端的连接必须是同步的,比如欢迎信息等,你必须等待服务端写入结束
才能做其他事情,但与服务器的交互和与用户的交互是异步的,这没有关系。

仔细看看rfc,我上面说过了,客户端与服务器的交互是阻塞方式的,客户端必须等待
服务端结束上一个请求处理后才能发送一个新的命令。
 
问题我已解决,可能是我没表达清楚,我的本意是服务器返回如下
220------------------------------------------------
Dmeserver FTP 现只对CERNET开放
。。。。。
-----------------------------------------------
220 DMEServer FTP server ready.
字串,但并不是一次返回,也就是我第一次收到220的返回码不能就发
下一命令,而要等服务器消息发完后再发下一命令。我想问的是如何知
道服务器应答完毕,经过研究,如返回行中第四位为'-'则应答未完,如
为' '则完。即220-.....(未完),220 (完)。
不过我又有问题想请教:
我连的Serv-U服务器。
我在程序中用了LIST后得到如下信息:
drw-rw-rw- 1 user group 0 Dec 9 14:59 .
drw-rw-rw- 1 user group 0 Dec 9 14:59 ..
-rw-rw-rw- 1 user group 0 Jan 14 11:54 1.txt
-r--r--r-- 1 user group 20 Dec 19 15:31 72.txt
-r--r--r-- 1 user group 37663 Mar 28 2001 72.zip
-rw-rw-rw- 1 user group 2993875 Dec 9 14:55 susetup.exe
出了72.zip有年信息外其他2002年2003年的文档都没有。而1.txt是2003年的
其他是2002年的,请问如何才能正确得到文件日期???
 
这恐怕你没有办法了,你能做就是发一个port和list或nlst命令,或者你试一下nlst命令?
我来不及查rfc,你仔细看一下,如果server-u就支持到这样,你也是没有办法的。如果
他愿意,你就是发一个user命令,她也可以把这个结果返回给你呀[:D]
写这种东西,还是查rfc吧。
我刚刚开始在写一个ftp server,rfc才看了一点点,也不是特别熟。
 
我觉得RFC看起来很累,看一点明白一点,但看完了都不自己明白的是什么[:(]
 
我想Serv-U应该返回了详细信息吧,因为我用LeapFtp和CuteFtp试过,它们也是用LIST 都
得到了详细日期。
 
既然如此,你就更应该明白,这不是你能够控制的东西。[8D]
 
既然LEapFTP用LIST能得到,为什么我用LIST不能得到?
 
是我看错了,sorry[8D]
这样,你去搜索一下jftpd,是麻省工学院的一帮学生写的一个基于java的
开源ftp服务器,这样你很容易就知道cuteftp发了什么命令过去。
 
To :小猪
谢谢!前几天我一同事说你出差去北京,我以为你没时间回我的贴了,没想到你还能回
非常感谢!我用工具追了一下,LeapFTP用LIST后和我程序中收到的信息是一样的(452个字节),
我现在知道它是怎么做的了,它先判断有无年信息,有则用服务器信息,无则为本年,
如本年该月未到,则为上年。
 
关于你最初的问题的rfc说明:
4.2. FTP REPLIES

Replies to File Transfer Protocol commands are devised to ensure
the synchronization of requests and actions in the process of file
transfer, and to guarantee that the user process always knows the
state of the Server. Every command must generate at least one
reply, although there may be more than one; in the latter case,
the multiple replies must be easily distinguished. In addition,
some commands occur in sequential groups, such as USER, PASS and
ACCT, or RNFR and RNTO. The replies show the existence of an
intermediate state if all preceding commands have been successful.
A failure at any point in the sequence necessitates the repetition
of the entire sequence from the beginning.

The details of the command-reply sequence are made explicit in
a set of state diagrams below.

An FTP reply consists of a three digit number (transmitted as
three alphanumeric characters) followed by some text. The number
is intended for use by automata to determine what state to enter
next; the text is intended for the human user. It is intended
that the three digits contain enough encoded information that the
user-process (the User-PI) will not need to examine the text and
may either discard it or pass it on to the user, as appropriate.
In particular, the text may be server-dependent, so there are
likely to be varying texts for each reply code.

A reply is defined to contain the 3-digit code, followed by Space
<SP>, followed by one line of text (where some maximum line length
has been specified), and terminated by the Telnet end-of-line
code. There will be cases however, where the text is longer than
a single line. In these cases the complete text must be bracketed
so the User-process knows when it may stop reading the reply (i.e.
stop processing input on the control connection) and go do other
things. This requires a special format on the first line to
indicate that more than one line is coming, and another on the
last line to designate it as the last. At least one of these must
contain the appropriate reply code to indicate the state of the
transaction. To satisfy all factions, it was decided that both
the first and last line codes should be the same.

Thus the format for multi-line replies is that the first line
will begin with the exact required reply code, followed
immediately by a Hyphen, "-" (also known as Minus), followed by
text. The last line will begin with the same code, followed
immediately by Space <SP>, optionally some text, and the Telnet
end-of-line code.

For example:
123-First line
Second line
234 A line beginning with numbers
123 The last line

The user-process then simply needs to search for the second
occurrence of the same reply code, followed by <SP> (Space), at
the beginning of a line, and ignore all intermediary lines. If
an intermediary line begins with a 3-digit number, the Server
must pad the front to avoid confusion.

This scheme allows standard system routines to be used for
reply information (such as for the STAT reply), with
"artificial" first and last lines tacked on. In rare cases
where these routines are able to generate three digits and a
Space at the beginning of any line, the beginning of each
text line should be offset by some neutral text, like Space.

This scheme assumes that multi-line replies may not be nested.
 
谢谢!RFC595我已找到。
 
多人接受答案了。
 
后退
顶部