From: Guido van Rossum Date: Mon, 16 Nov 1992 16:55:11 +0000 (+0000) Subject: Added comments, use 'global' and change prompt to "ftp.py> " X-Git-Tag: v0.9.8~92 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bfef4a0873e9d19be84819eaad8b774d0d7b3d2e;p=thirdparty%2FPython%2Fcpython.git Added comments, use 'global' and change prompt to "ftp.py> " --- diff --git a/Demo/sockets/ftp.py b/Demo/sockets/ftp.py index ff15642fbf67..f5bbdf504a4f 100755 --- a/Demo/sockets/ftp.py +++ b/Demo/sockets/ftp.py @@ -4,6 +4,18 @@ # but this is not a complete implementation! Yet it shows how a simple # FTP client can be built, and you are welcome to extend it to suit # it to your needs... +# +# How it works (assuming you've read the RFC): +# +# User commands are passed uninterpreted to the server. However, the +# user never needs to send a PORT command. Rather, the client opens a +# port right away and sends the appropriate PORT command to the server. +# When a response code 150 is received, this port is used to receive +# the data (which is written to stdout in this version), and when the +# data is exhausted, a new port is opened and a corresponding PORT +# command sent. In order to avoid errors when reusing ports quickly +# (and because there is no s.getsockname() method in Python yet) we +# cycle through a number of ports in the 50000 range. import sys, posix, string @@ -60,12 +72,12 @@ def control(hostname): # (Cycle through a number of ports to avoid problems with reusing # a port within a short time.) # -cycle = [0] +nextport = 0 # def newdataport(s, f): - port = cycle[0] - cycle[0] = (port+1) % 16 - port = port + FTP_DATA_PORT + global nextport + port = nextport + FTP_DATA_PORT + nextport = (nextport+1) % 16 r = socket(AF_INET, SOCK_STREAM) r.bind(gethostbyname(gethostname()), port) r.listen(0) @@ -122,7 +134,7 @@ def getdata(r): # def getcommand(): try: - return raw_input('ftp> ') + return raw_input('ftp.py> ') except EOFError: return ''