Use getsockname() if it exists
diff --git a/Lib/ftplib.py b/Lib/ftplib.py
index 4e74090..ed588b5 100644
--- a/Lib/ftplib.py
+++ b/Lib/ftplib.py
@@ -48,12 +48,11 @@
 
 
 # Next port to be used by makeport(), with PORT_OFFSET added
+# (This is now only used when the python interpreter doesn't support
+# the getsockname() method yet)
 nextport = 0
 PORT_OFFSET = 40000
 PORT_CYCLE = 1000
-# XXX This is a nuisance: when using the program several times in a row,
-# reusing the port doesn't work and you have to edit the first port
-# assignment...  We need getsockname()!
 
 
 # The class itself
@@ -152,11 +151,10 @@
 		self.putcmd(cmd)
 		return self.getresp()
 
-	# Send a command and ignore the response, which must begin with '2'
+	# Send a command and expect a response beginning with '2'
 	def voidcmd(self, cmd):
-		resp = self.sendcmd(cmd)
-		if resp[0] <> '2':
-			raise error_reply, resp
+		self.putcmd(cmd)
+		self.voidresp()
 
 	# Send a PORT command with the current host and the given port number
 	def sendport(self, port):
@@ -171,11 +169,20 @@
 	# Create a new socket and send a PORT command for it
 	def makeport(self):
 		global nextport
-		port = nextport + PORT_OFFSET
-		nextport = (nextport + 1) % PORT_CYCLE
 		sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-		sock.bind('', port)
-		sock.listen(0)
+		try:
+			getsockname = sock.getsockname
+		except AttributeError:
+			if self.debugging > 1:
+				print '*** getsockname not supported',
+				print '-- using manual port assignment ***'
+			port = nextport + PORT_OFFSET
+			nextport = (nextport + 1) % PORT_CYCLE
+			sock.bind('', port)
+			getsockname = None
+		sock.listen(0) # Assigns the port if not explicitly bound
+		if getsockname:
+			host, port = getsockname()
 		resp = self.sendport(port)
 		return sock