Change socket.error to inherit from IOError rather than being a stand
alone class.  This addresses the primary concern in

 http://bugs.python.org/issue1706815

python-dev discussion here:

 http://mail.python.org/pipermail/python-dev/2007-July/073749.html

I chose IOError rather than EnvironmentError as the base class since
socket objects are often used as transparent duck typed file objects
in code already prepared to deal with IOError exceptions.

also a minor fix:

 urllib2 - fix a couple places where IOError was raised rather than URLError.
           for better or worse, URLError already inherits from IOError so
           this won't break any existing code.

 test_urllib2net - replace bad ftp urls.
diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst
index 9081cf7..623d73b 100644
--- a/Doc/library/exceptions.rst
+++ b/Doc/library/exceptions.rst
@@ -170,6 +170,9 @@
    This class is derived from :exc:`EnvironmentError`.  See the discussion above
    for more information on exception instance attributes.
 
+   .. versionchanged:: 2.6
+      Changed :exc:`socket.error` to use this as a base class.
+
 
 .. exception:: ImportError
 
diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst
index ca4515f..dbe7e66 100644
--- a/Doc/library/socket.rst
+++ b/Doc/library/socket.rst
@@ -86,6 +86,9 @@
    accompanying :exc:`os.error`. See the module :mod:`errno`, which contains names
    for the error codes defined by the underlying operating system.
 
+   .. versionchanged:: 2.6
+      :exc:`socket.error` is now a child class of :exc:`IOError`.
+
 
 .. exception:: herror
 
diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst
index a5ed869..6c799fd 100644
--- a/Doc/whatsnew/2.6.rst
+++ b/Doc/whatsnew/2.6.rst
@@ -282,7 +282,8 @@
 This section lists previously described changes that may require changes to your
 code:
 
-* Everything is all in the details!
+* The :mod:`socket` module exception :exc:`socket.error` now inherits from 
+  :exc:`IOError`.
 
 .. % ======================================================================
 
diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py
index c363140..9d4f463 100644
--- a/Lib/test/test_urllib2net.py
+++ b/Lib/test/test_urllib2net.py
@@ -166,8 +166,9 @@
 
     def test_ftp(self):
         urls = [
-            'ftp://www.python.org/pub/python/misc/sousa.au',
-            'ftp://www.python.org/pub/tmp/blat',
+            'ftp://ftp.kernel.org/pub/linux/kernel/README',
+            'ftp://ftp.kernel.org/pub/linux/kernel/non-existant-file',
+            #'ftp://ftp.kernel.org/pub/leenox/kernel/test',
             'ftp://gatekeeper.research.compaq.com/pub/DEC/SRC'
                 '/research-reports/00README-Legal-Rules-Regs',
             ]
@@ -181,10 +182,7 @@
             f.close()
             urls = [
                 'file:'+sanepathname2url(os.path.abspath(TESTFN)),
-
-                # XXX bug, should raise URLError
-                #('file://nonsensename/etc/passwd', None, urllib2.URLError)
-                ('file://nonsensename/etc/passwd', None, (EnvironmentError, socket.error))
+                ('file:///nonsensename/etc/passwd', None, urllib2.URLError),
                 ]
             self._test_urls(urls, self._extra_handlers())
         finally:
@@ -244,11 +242,11 @@
             debug(url)
             try:
                 f = urllib2.urlopen(url, req)
-            except (IOError, socket.error, OSError), err:
+            except EnvironmentError, err:
                 debug(err)
                 if expected_err:
-                    msg = ("Didn't get expected error(s) %s for %s %s, got %s" %
-                           (expected_err, url, req, err))
+                    msg = ("Didn't get expected error(s) %s for %s %s, got %s: %s" %
+                           (expected_err, url, req, type(err), err))
                     self.assert_(isinstance(err, expected_err), msg)
             else:
                 with test_support.transient_internet():
diff --git a/Lib/urllib2.py b/Lib/urllib2.py
index b2cec72..5a6f499 100644
--- a/Lib/urllib2.py
+++ b/Lib/urllib2.py
@@ -1246,7 +1246,7 @@
         import mimetypes
         host = req.get_host()
         if not host:
-            raise IOError, ('ftp error', 'no host given')
+            raise URLError, ('ftp error', 'no host given')
         host, port = splitport(host)
         if port is None:
             port = ftplib.FTP_PORT
@@ -1292,7 +1292,7 @@
             headers = mimetools.Message(sf)
             return addinfourl(fp, headers, req.get_full_url())
         except ftplib.all_errors, msg:
-            raise IOError, ('ftp error', msg), sys.exc_info()[2]
+            raise URLError, ('ftp error', msg), sys.exc_info()[2]
 
     def connect_ftp(self, user, passwd, host, port, dirs, timeout):
         fw = ftpwrapper(user, passwd, host, port, dirs, timeout)
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index d319ca3..410398e 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -4280,7 +4280,8 @@
 	if (m == NULL)
 		return;
 
-	socket_error = PyErr_NewException("socket.error", NULL, NULL);
+	socket_error = PyErr_NewException("socket.error",
+					  PyExc_IOError, NULL);
 	if (socket_error == NULL)
 		return;
         PySocketModuleAPI.error = socket_error;