[medusa] Re: Usage for recv_channel in ftp_server.py

Youngbong Choe hurd@s...
Wed, 16 Feb 2000 01:27:06 -0800


Thank you sam :)

sam rushing <rushin-@n...> wrote: 
original article:http://www.egroups.com/group/medusa/?start=144
> Youngbong Choe writes:
> > hi, i'm a newbie in python and medusa.
> > 
> > I built a simple file server using asyncore.py and asynchat.py,
> > recv_channel and xmit_channel classes.
> > but i could not understatand recv_channel, xmit_channel flow
exactly.
> 
> Unless you really *need* to use the FTP protocol, I would not
> recommend modeling a new protocol on it (especially if your purpose
is 
> to learn how to do protocols!). It's a bit over-complicated
> because of the way it uses separate data and command channels.
> 
> A simpler approach would be something modeled on HTTP, where
> commands and data are sent over a single socket. [this works because
> a TCP stream is a two-way communications channel; commands can go
> in one direction, data the other]
> 
> > My question is this:
> > 
> > 1. After adding new xmit channel and then push_with_producer(...
.),
> > how can a client get the data? need new socket? or using current
socket?
> > 2. After adding new recv channel, how can a client send the data?
> 
> This is what makes the ftp model complicated: since it uses a
separate 
> channel for data it is necessary to
> 
> 1) set up a new listening socket
> 2) tell the client side what port to connect to
> 3) accept the client's connection, thereby
> 4) creating *another* socket, which you then send
> the data over.
> 
> [I just described PASV-mode ftp, normal-mode FTP is just the
> same only the client does the listening]
> 
> See? Very complicated compared to:
> 
> class simple_file_transfer_channel:
> def __init__ (self, conn):
> self.set_terminator ('\r\n')
> 
> [...]
> def found_terminator (self):
> self.buffer, filename = '', self.buffer
> self.push_with_producer (hypothetical_filename_producer
(filename))
> 
> [...]
> 
> In the above, you could request a file like this:
> 
> $ telnet mymachine 9021
> /etc/resolv.conf<return>
> [... contents of /etc/resolv.conf ...]
> 
> Hope that helps!
> 
> -Sam
>