asyncore and OOB data
billiejoex
gnewsg at gmail.com
Wed Jul 11 22:11:37 EDT 2007
Douglas Wells wrote:
> Second, when I look at the FTP specification, I don't find the
> concept of OOB anywhere. So, it's not clear what OOB data would
> mean in terms of the defined FTP commands in any case.
Steve Holde wrote:
> You are correct, however, in stating that the FTP
> protocol doesn't support or implement out-of-band
> data transmissions.
Wait a sec. RFC959 [1], on chapter 4.1.3 says:
> Certain commands (such as ABOR, STAT, QUIT) may be sent over the
> control connection while a data transfer is in progress. Some
> servers may not be able to monitor the control and data connections
> simultaneously, in which case some special action will be necessary
> to get the server's attention. The following ordered format is
> tentatively recommended:
> 1. User system inserts the Telnet "Interrupt Process" (IP) signal
> in the Telnet stream.
> 2. User system sends the Telnet "Synch" signal.
> 3. User system inserts the command (e.g., ABOR) in the Telnet
> stream.
> 4. Server PI, after receiving "IP", scans the Telnet stream for
> EXACTLY ONE FTP command.
I believe that the TCP "urgent" flag, activated by using
socket.MSG_OOB, should be set when client must send the "Sync" signal
(RFC854 [2] talks about it). I think that you do not find references
of OOB in RFC959 (FTP) just because it is specified into RFC854
(Telnet).
According to RFC854 a Sync signal should consist of sending Telnet
DATA MARK (DM) inside a TCP packet with URGent flag set:
> The Synch is sent via the TCP send operation with the Urgent
> flag set and the DM as the last (or only) data octet.
If we'd want to traduce this in Python we could assume that a fully
RFC-compliant FTP client implementation sending 'ABOR' command should
act like this:
>>> import socket, telnetlib
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> s.connect(('127.0.0.1', 21))
>>> s.sendall(telnetlib.IP)
>>> s.sendall(telnetlib.DM, socket.MSG_OOB)
>>> s.sendall('ABOR\r\n')
We also could find references about such flag ("URG"ent, alias OOB)
even in Bernstein FTP-related paper (http://cr.yp.to/ftp/
pipelining.html) which says:
> The client is required to send the TELNET string \377\364, and
> then send the TELNET string \377\362 with the TCP Urgent bit
> set, immediately before the ABOR request.
...that, traduced, should appear like this:
>>> s.sendall("\377\364") # Telnet IP signal?
>>> s.sendall("\377\362", socket.MSG_OOB) # Telnet Synch signal?
>>> s.sendall("ABOR\r\n")
I also find interesting the fact that ftplib ABOR command
implementation is not RFC-compliant (and I can't realize how my server
could recognize it):
def abort(self):
'''Abort a file transfer. Uses out-of-band data.
This does not follow the procedure from the RFC to send Telnet
IP and Synch; that doesn't seem to work with the servers I've
tried. Instead, just send the ABOR command as OOB data.'''
line = 'ABOR' + CRLF
if self.debugging > 1: print '*put urgent*',
self.sanitize(line)
self.sock.sendall(line, MSG_OOB)
resp = self.getmultiline()
if resp[:3] not in ('426', '226'):
raise error_proto, resp
[1] http://www.faqs.org/rfcs/rfc959.html
[2] http://www.faqs.org/rfcs/rfc854.html
More information about the Python-list
mailing list