blob: 30be5c5324c37c197a9201ebe24b325c157b26e2 [file] [log] [blame]
Fred Drakea6070f02000-08-16 14:14:32 +00001# Wrapper module for _socket, providing some additional facilities
2# implemented in Python.
3
4"""\
5This module provides socket operations and some related functions.
6On Unix, it supports IP (Internet Protocol) and Unix domain sockets.
Tim Peters495ad3c2001-01-15 01:36:40 +00007On other systems, it only supports IP. Functions specific for a
Martin v. Löwisaf484d52000-09-30 11:34:30 +00008socket are available as methods of the socket object.
Fred Drakea6070f02000-08-16 14:14:32 +00009
10Functions:
11
12socket() -- create a new socket object
Dave Cole331708b2004-08-09 04:51:41 +000013socketpair() -- create a pair of new socket objects [*]
Fred Drakea6070f02000-08-16 14:14:32 +000014fromfd() -- create a socket object from an open file descriptor [*]
15gethostname() -- return the current hostname
16gethostbyname() -- map a hostname to its IP number
17gethostbyaddr() -- map an IP number or hostname to DNS info
18getservbyname() -- map a service name and a protocol name to a port number
19getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number
20ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order
21htons(), htonl() -- convert 16, 32 bit int from host to network byte order
22inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format
23inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)
24ssl() -- secure socket layer support (only available if configured)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000025socket.getdefaulttimeout() -- get the default timeout value
26socket.setdefaulttimeout() -- set the default timeout value
Neal Norwitz0d4c06e2007-04-25 06:30:05 +000027create_connection() -- connects to an address, with an optional timeout
Fred Drakea6070f02000-08-16 14:14:32 +000028
29 [*] not available on all platforms!
30
31Special objects:
32
33SocketType -- type object for socket objects
34error -- exception raised for I/O errors
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000035has_ipv6 -- boolean value indicating if IPv6 is supported
Fred Drakea6070f02000-08-16 14:14:32 +000036
37Integer constants:
38
39AF_INET, AF_UNIX -- socket domains (first argument to socket() call)
40SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)
41
42Many other constants may be defined; these may be used in calls to
43the setsockopt() and getsockopt() methods.
44"""
45
Tim Peters18e67782002-02-17 04:25:24 +000046import _socket
Fred Drakea6070f02000-08-16 14:14:32 +000047from _socket import *
Tim Peters18e67782002-02-17 04:25:24 +000048
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000049try:
Guido van Rossumde7cade2002-08-08 15:25:28 +000050 import _ssl
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000051except ImportError:
Bill Janssen426ea0a2007-08-29 22:35:05 +000052 # no SSL support
Guido van Rossumc18993f2002-08-08 15:16:20 +000053 pass
Bill Janssen426ea0a2007-08-29 22:35:05 +000054else:
55 def ssl(sock, keyfile=None, certfile=None):
56 # we do an internal import here because the ssl
57 # module imports the socket module
58 import ssl as _realssl
Bill Janssen98d19da2007-09-10 21:51:02 +000059 warnings.warn("socket.ssl() is deprecated. Use ssl.wrap_socket() instead.",
Bill Janssen426ea0a2007-08-29 22:35:05 +000060 DeprecationWarning, stacklevel=2)
61 return _realssl.sslwrap_simple(sock, keyfile, certfile)
Fred Drakea6070f02000-08-16 14:14:32 +000062
Bill Janssen426ea0a2007-08-29 22:35:05 +000063 # we need to import the same constants we used to...
Bill Janssen98d19da2007-09-10 21:51:02 +000064 from _ssl import SSLError as sslerror
Bill Janssen426ea0a2007-08-29 22:35:05 +000065 from _ssl import \
Bill Janssen426ea0a2007-08-29 22:35:05 +000066 RAND_add, \
67 RAND_egd, \
68 RAND_status, \
69 SSL_ERROR_ZERO_RETURN, \
70 SSL_ERROR_WANT_READ, \
71 SSL_ERROR_WANT_WRITE, \
72 SSL_ERROR_WANT_X509_LOOKUP, \
73 SSL_ERROR_SYSCALL, \
74 SSL_ERROR_SSL, \
75 SSL_ERROR_WANT_CONNECT, \
76 SSL_ERROR_EOF, \
77 SSL_ERROR_INVALID_ERROR_CODE
78
79import os, sys, warnings
Fred Drakea6070f02000-08-16 14:14:32 +000080
Fred Drake70d566b2003-04-29 19:50:25 +000081try:
82 from errno import EBADF
83except ImportError:
84 EBADF = 9
85
Skip Montanaro0de65802001-02-15 22:15:14 +000086__all__ = ["getfqdn"]
Skip Montanaro0de65802001-02-15 22:15:14 +000087__all__.extend(os._get_exports_list(_socket))
Bill Janssen426ea0a2007-08-29 22:35:05 +000088
Skip Montanaro0de65802001-02-15 22:15:14 +000089
Guido van Rossumc18993f2002-08-08 15:16:20 +000090_realsocket = socket
Fred Drakea6070f02000-08-16 14:14:32 +000091
92# WSA error codes
93if sys.platform.lower().startswith("win"):
94 errorTab = {}
95 errorTab[10004] = "The operation was interrupted."
96 errorTab[10009] = "A bad file handle was passed."
97 errorTab[10013] = "Permission denied."
98 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
99 errorTab[10022] = "An invalid operation was attempted."
100 errorTab[10035] = "The socket operation would block"
101 errorTab[10036] = "A blocking operation is already in progress."
102 errorTab[10048] = "The network address is in use."
103 errorTab[10054] = "The connection has been reset."
104 errorTab[10058] = "The network has been shut down."
105 errorTab[10060] = "The operation timed out."
106 errorTab[10061] = "Connection refused."
107 errorTab[10063] = "The name is too long."
108 errorTab[10064] = "The host is down."
109 errorTab[10065] = "The host is unreachable."
Skip Montanaro64de1a42001-03-18 19:53:21 +0000110 __all__.append("errorTab")
Guido van Rossumde7cade2002-08-08 15:25:28 +0000111
Fred Drakea6070f02000-08-16 14:14:32 +0000112
113
114def getfqdn(name=''):
115 """Get fully qualified domain name from name.
116
117 An empty argument is interpreted as meaning the local host.
118
119 First the hostname returned by gethostbyaddr() is checked, then
120 possibly existing aliases. In case no FQDN is available, hostname
Brett Cannon01668a12005-03-11 00:04:17 +0000121 from gethostname() is returned.
Fred Drakea6070f02000-08-16 14:14:32 +0000122 """
123 name = name.strip()
Peter Schneider-Kamp2d2785a2000-08-16 20:30:21 +0000124 if not name or name == '0.0.0.0':
Fred Drakea6070f02000-08-16 14:14:32 +0000125 name = gethostname()
126 try:
127 hostname, aliases, ipaddrs = gethostbyaddr(name)
128 except error:
129 pass
130 else:
131 aliases.insert(0, hostname)
132 for name in aliases:
133 if '.' in name:
134 break
135 else:
136 name = hostname
137 return name
138
139
Guido van Rossume5e50592001-08-18 01:23:20 +0000140_socketmethods = (
141 'bind', 'connect', 'connect_ex', 'fileno', 'listen',
142 'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
Skip Montanaroc6899182003-04-29 19:27:26 +0000143 'sendall', 'setblocking',
Guido van Rossum67f7a382002-06-06 21:08:16 +0000144 'settimeout', 'gettimeout', 'shutdown')
Guido van Rossume5e50592001-08-18 01:23:20 +0000145
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000146if sys.platform == "riscos":
147 _socketmethods = _socketmethods + ('sleeptaskw',)
148
Martin v. Löwis7596e832006-07-01 15:33:37 +0000149# All the method names that must be delegated to either the real socket
150# object or the _closedsocket object.
151_delegate_methods = ("recv", "recvfrom", "recv_into", "recvfrom_into",
152 "send", "sendto")
153
Guido van Rossum715f9702002-08-08 18:11:36 +0000154class _closedsocket(object):
155 __slots__ = []
Skip Montanaroc6899182003-04-29 19:27:26 +0000156 def _dummy(*args):
Fred Drake70d566b2003-04-29 19:50:25 +0000157 raise error(EBADF, 'Bad file descriptor')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000158 # All _delegate_methods must also be initialized here.
159 send = recv = recv_into = sendto = recvfrom = recvfrom_into = _dummy
160 __getattr__ = _dummy
Guido van Rossum715f9702002-08-08 18:11:36 +0000161
Martin v. Löwisf25e35b2007-07-27 18:28:22 +0000162# Wrapper around platform socket objects. This implements
163# a platform-independent dup() functionality. The
164# implementation currently relies on reference counting
165# to close the underlying socket object.
Guido van Rossumc18993f2002-08-08 15:16:20 +0000166class _socketobject(object):
Fred Drakea6070f02000-08-16 14:14:32 +0000167
Guido van Rossumc18993f2002-08-08 15:16:20 +0000168 __doc__ = _realsocket.__doc__
169
Martin v. Löwis7596e832006-07-01 15:33:37 +0000170 __slots__ = ["_sock", "__weakref__"] + list(_delegate_methods)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000171
Guido van Rossumc18993f2002-08-08 15:16:20 +0000172 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
173 if _sock is None:
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000174 _sock = _realsocket(family, type, proto)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000175 self._sock = _sock
Martin v. Löwis7596e832006-07-01 15:33:37 +0000176 for method in _delegate_methods:
177 setattr(self, method, getattr(_sock, method))
Fred Drakea6070f02000-08-16 14:14:32 +0000178
179 def close(self):
Guido van Rossum715f9702002-08-08 18:11:36 +0000180 self._sock = _closedsocket()
Martin v. Löwis7596e832006-07-01 15:33:37 +0000181 dummy = self._sock._dummy
182 for method in _delegate_methods:
183 setattr(self, method, dummy)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000184 close.__doc__ = _realsocket.close.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000185
Fred Drakea6070f02000-08-16 14:14:32 +0000186 def accept(self):
187 sock, addr = self._sock.accept()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000188 return _socketobject(_sock=sock), addr
189 accept.__doc__ = _realsocket.accept.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000190
191 def dup(self):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000192 """dup() -> socket object
193
194 Return a new socket object connected to the same system resource."""
195 return _socketobject(_sock=self._sock)
Fred Drakea6070f02000-08-16 14:14:32 +0000196
197 def makefile(self, mode='r', bufsize=-1):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000198 """makefile([mode[, bufsize]]) -> file object
199
200 Return a regular file object corresponding to the socket. The mode
201 and bufsize arguments are as for the built-in open() function."""
Fred Drakea6070f02000-08-16 14:14:32 +0000202 return _fileobject(self._sock, mode, bufsize)
Tim Peters0ae07bd2006-03-22 03:23:21 +0000203
Georg Brandlbb03ac02006-03-21 18:17:25 +0000204 family = property(lambda self: self._sock.family, doc="the socket family")
205 type = property(lambda self: self._sock.type, doc="the socket type")
206 proto = property(lambda self: self._sock.proto, doc="the socket protocol")
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000207
Guido van Rossumc18993f2002-08-08 15:16:20 +0000208 _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
209 "%s.__doc__ = _realsocket.%s.__doc__\n")
Guido van Rossume5e50592001-08-18 01:23:20 +0000210 for _m in _socketmethods:
Guido van Rossumc18993f2002-08-08 15:16:20 +0000211 exec _s % (_m, _m, _m, _m)
Tim Petersd7e8a0d2002-08-08 20:07:03 +0000212 del _m, _s
Fred Drakea6070f02000-08-16 14:14:32 +0000213
Skip Montanaro89feabc2003-03-30 04:54:24 +0000214socket = SocketType = _socketobject
Fred Drakea6070f02000-08-16 14:14:32 +0000215
Guido van Rossumc18993f2002-08-08 15:16:20 +0000216class _fileobject(object):
Guido van Rossum443fec32002-08-08 01:02:16 +0000217 """Faux file object attached to a socket object."""
218
219 default_bufsize = 8192
Guido van Rossumc18993f2002-08-08 15:16:20 +0000220 name = "<socket>"
221
222 __slots__ = ["mode", "bufsize", "softspace",
223 # "closed" is a property, see below
Georg Brandldd7b0522007-01-21 10:35:10 +0000224 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf",
225 "_close"]
Fred Drakea6070f02000-08-16 14:14:32 +0000226
Georg Brandldd7b0522007-01-21 10:35:10 +0000227 def __init__(self, sock, mode='rb', bufsize=-1, close=False):
Fred Drakea6070f02000-08-16 14:14:32 +0000228 self._sock = sock
Guido van Rossumc18993f2002-08-08 15:16:20 +0000229 self.mode = mode # Not actually used in this version
Guido van Rossum443fec32002-08-08 01:02:16 +0000230 if bufsize < 0:
231 bufsize = self.default_bufsize
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000232 self.bufsize = bufsize
233 self.softspace = False
Guido van Rossum443fec32002-08-08 01:02:16 +0000234 if bufsize == 0:
235 self._rbufsize = 1
236 elif bufsize == 1:
237 self._rbufsize = self.default_bufsize
238 else:
239 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000240 self._wbufsize = bufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000241 self._rbuf = "" # A string
242 self._wbuf = [] # A list of strings
Georg Brandldd7b0522007-01-21 10:35:10 +0000243 self._close = close
Fred Drakea6070f02000-08-16 14:14:32 +0000244
Guido van Rossumc18993f2002-08-08 15:16:20 +0000245 def _getclosed(self):
Tim Peters116d83c2004-03-28 02:20:45 +0000246 return self._sock is None
Guido van Rossumc18993f2002-08-08 15:16:20 +0000247 closed = property(_getclosed, doc="True if the file is closed")
248
Fred Drakea6070f02000-08-16 14:14:32 +0000249 def close(self):
250 try:
251 if self._sock:
252 self.flush()
253 finally:
Georg Brandldd7b0522007-01-21 10:35:10 +0000254 if self._close:
255 self._sock.close()
Guido van Rossum67f7a382002-06-06 21:08:16 +0000256 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000257
258 def __del__(self):
Guido van Rossum65f8ced2003-05-29 14:36:57 +0000259 try:
260 self.close()
261 except:
262 # close() may fail if __init__ didn't complete
263 pass
Fred Drakea6070f02000-08-16 14:14:32 +0000264
265 def flush(self):
266 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000267 buffer = "".join(self._wbuf)
268 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000269 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000270
Neal Norwitz2b342902002-06-13 22:18:39 +0000271 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000272 return self._sock.fileno()
273
274 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000275 data = str(data) # XXX Should really reject non-string non-buffers
276 if not data:
277 return
278 self._wbuf.append(data)
279 if (self._wbufsize == 0 or
280 self._wbufsize == 1 and '\n' in data or
281 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000282 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000283
284 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000285 # XXX We could do better here for very long lists
286 # XXX Should really reject non-string non-buffers
287 self._wbuf.extend(filter(None, map(str, list)))
288 if (self._wbufsize <= 1 or
289 self._get_wbuf_len() >= self._wbufsize):
290 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000291
Guido van Rossum443fec32002-08-08 01:02:16 +0000292 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000293 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000294 for x in self._wbuf:
295 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000296 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000297
Guido van Rossum67f7a382002-06-06 21:08:16 +0000298 def read(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000299 data = self._rbuf
Guido van Rossum443fec32002-08-08 01:02:16 +0000300 if size < 0:
301 # Read until EOF
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000302 buffers = []
303 if data:
304 buffers.append(data)
305 self._rbuf = ""
Guido van Rossum443fec32002-08-08 01:02:16 +0000306 if self._rbufsize <= 1:
307 recv_size = self.default_bufsize
308 else:
309 recv_size = self._rbufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000310 while True:
Guido van Rossum443fec32002-08-08 01:02:16 +0000311 data = self._sock.recv(recv_size)
312 if not data:
313 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000314 buffers.append(data)
315 return "".join(buffers)
Guido van Rossum443fec32002-08-08 01:02:16 +0000316 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000317 # Read until size bytes or EOF seen, whichever comes first
318 buf_len = len(data)
319 if buf_len >= size:
320 self._rbuf = data[size:]
321 return data[:size]
322 buffers = []
323 if data:
324 buffers.append(data)
325 self._rbuf = ""
326 while True:
327 left = size - buf_len
328 recv_size = max(self._rbufsize, left)
Guido van Rossum443fec32002-08-08 01:02:16 +0000329 data = self._sock.recv(recv_size)
330 if not data:
331 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000332 buffers.append(data)
333 n = len(data)
334 if n >= left:
335 self._rbuf = data[left:]
336 buffers[-1] = data[:left]
337 break
338 buf_len += n
339 return "".join(buffers)
Fred Drakea6070f02000-08-16 14:14:32 +0000340
Guido van Rossum67f7a382002-06-06 21:08:16 +0000341 def readline(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000342 data = self._rbuf
343 if size < 0:
344 # Read until \n or EOF, whichever comes first
Guido van Rossum48b79692002-08-08 17:34:19 +0000345 if self._rbufsize <= 1:
346 # Speed up unbuffered case
347 assert data == ""
348 buffers = []
349 recv = self._sock.recv
350 while data != "\n":
351 data = recv(1)
352 if not data:
353 break
354 buffers.append(data)
355 return "".join(buffers)
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000356 nl = data.find('\n')
357 if nl >= 0:
358 nl += 1
359 self._rbuf = data[nl:]
360 return data[:nl]
361 buffers = []
362 if data:
363 buffers.append(data)
364 self._rbuf = ""
365 while True:
366 data = self._sock.recv(self._rbufsize)
367 if not data:
368 break
369 buffers.append(data)
370 nl = data.find('\n')
371 if nl >= 0:
372 nl += 1
373 self._rbuf = data[nl:]
374 buffers[-1] = data[:nl]
375 break
376 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000377 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000378 # Read until size bytes or \n or EOF seen, whichever comes first
379 nl = data.find('\n', 0, size)
380 if nl >= 0:
381 nl += 1
382 self._rbuf = data[nl:]
383 return data[:nl]
384 buf_len = len(data)
385 if buf_len >= size:
386 self._rbuf = data[size:]
387 return data[:size]
388 buffers = []
389 if data:
390 buffers.append(data)
391 self._rbuf = ""
392 while True:
393 data = self._sock.recv(self._rbufsize)
394 if not data:
395 break
396 buffers.append(data)
397 left = size - buf_len
398 nl = data.find('\n', 0, left)
399 if nl >= 0:
400 nl += 1
401 self._rbuf = data[nl:]
402 buffers[-1] = data[:nl]
403 break
404 n = len(data)
405 if n >= left:
406 self._rbuf = data[left:]
407 buffers[-1] = data[:left]
408 break
409 buf_len += n
410 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000411
412 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000413 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000414 list = []
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000415 while True:
Fred Drakea6070f02000-08-16 14:14:32 +0000416 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000417 if not line:
418 break
Fred Drakea6070f02000-08-16 14:14:32 +0000419 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000420 total += len(line)
421 if sizehint and total >= sizehint:
422 break
Fred Drakea6070f02000-08-16 14:14:32 +0000423 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000424
425 # Iterator protocols
426
427 def __iter__(self):
428 return self
429
430 def next(self):
431 line = self.readline()
432 if not line:
433 raise StopIteration
434 return line
Facundo Batista07c78be2007-03-23 18:54:07 +0000435
436
437def create_connection(address, timeout=None):
438 """Connect to address (host, port) with an optional timeout.
439
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000440 Provides access to socketobject timeout for higher-level
441 protocols. Passing a timeout will set the timeout on the
Facundo Batista07c78be2007-03-23 18:54:07 +0000442 socket instance (if not present, or passed as None, the
443 default global timeout setting will be used).
444 """
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000445
Facundo Batista07c78be2007-03-23 18:54:07 +0000446 msg = "getaddrinfo returns an empty list"
447 host, port = address
448 for res in getaddrinfo(host, port, 0, SOCK_STREAM):
449 af, socktype, proto, canonname, sa = res
450 sock = None
451 try:
452 sock = socket(af, socktype, proto)
453 if timeout is not None:
454 sock.settimeout(timeout)
455 sock.connect(sa)
456 return sock
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000457
Facundo Batista07c78be2007-03-23 18:54:07 +0000458 except error, msg:
459 if sock is not None:
460 sock.close()
461
462 raise error, msg