blob: 6b4b743f68072c014f8a3a35caadaac2a27cda2d [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',
Christian Heimesa47b75b2008-01-04 15:48:06 +0000144 'settimeout', 'gettimeout', 'shutdown')
145
146if os.name == "nt":
147 _socketmethods = _socketmethods + ('ioctl',)
Guido van Rossume5e50592001-08-18 01:23:20 +0000148
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000149if sys.platform == "riscos":
150 _socketmethods = _socketmethods + ('sleeptaskw',)
151
Martin v. Löwis7596e832006-07-01 15:33:37 +0000152# All the method names that must be delegated to either the real socket
153# object or the _closedsocket object.
154_delegate_methods = ("recv", "recvfrom", "recv_into", "recvfrom_into",
155 "send", "sendto")
156
Guido van Rossum715f9702002-08-08 18:11:36 +0000157class _closedsocket(object):
158 __slots__ = []
Skip Montanaroc6899182003-04-29 19:27:26 +0000159 def _dummy(*args):
Fred Drake70d566b2003-04-29 19:50:25 +0000160 raise error(EBADF, 'Bad file descriptor')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000161 # All _delegate_methods must also be initialized here.
162 send = recv = recv_into = sendto = recvfrom = recvfrom_into = _dummy
163 __getattr__ = _dummy
Guido van Rossum715f9702002-08-08 18:11:36 +0000164
Martin v. Löwisf25e35b2007-07-27 18:28:22 +0000165# Wrapper around platform socket objects. This implements
166# a platform-independent dup() functionality. The
167# implementation currently relies on reference counting
168# to close the underlying socket object.
Guido van Rossumc18993f2002-08-08 15:16:20 +0000169class _socketobject(object):
Fred Drakea6070f02000-08-16 14:14:32 +0000170
Guido van Rossumc18993f2002-08-08 15:16:20 +0000171 __doc__ = _realsocket.__doc__
172
Martin v. Löwis7596e832006-07-01 15:33:37 +0000173 __slots__ = ["_sock", "__weakref__"] + list(_delegate_methods)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000174
Guido van Rossumc18993f2002-08-08 15:16:20 +0000175 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
176 if _sock is None:
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000177 _sock = _realsocket(family, type, proto)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000178 self._sock = _sock
Martin v. Löwis7596e832006-07-01 15:33:37 +0000179 for method in _delegate_methods:
180 setattr(self, method, getattr(_sock, method))
Fred Drakea6070f02000-08-16 14:14:32 +0000181
182 def close(self):
Guido van Rossum715f9702002-08-08 18:11:36 +0000183 self._sock = _closedsocket()
Martin v. Löwis7596e832006-07-01 15:33:37 +0000184 dummy = self._sock._dummy
185 for method in _delegate_methods:
186 setattr(self, method, dummy)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000187 close.__doc__ = _realsocket.close.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000188
Fred Drakea6070f02000-08-16 14:14:32 +0000189 def accept(self):
190 sock, addr = self._sock.accept()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000191 return _socketobject(_sock=sock), addr
192 accept.__doc__ = _realsocket.accept.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000193
194 def dup(self):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000195 """dup() -> socket object
196
197 Return a new socket object connected to the same system resource."""
198 return _socketobject(_sock=self._sock)
Fred Drakea6070f02000-08-16 14:14:32 +0000199
200 def makefile(self, mode='r', bufsize=-1):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000201 """makefile([mode[, bufsize]]) -> file object
202
203 Return a regular file object corresponding to the socket. The mode
204 and bufsize arguments are as for the built-in open() function."""
Fred Drakea6070f02000-08-16 14:14:32 +0000205 return _fileobject(self._sock, mode, bufsize)
Tim Peters0ae07bd2006-03-22 03:23:21 +0000206
Georg Brandlbb03ac02006-03-21 18:17:25 +0000207 family = property(lambda self: self._sock.family, doc="the socket family")
208 type = property(lambda self: self._sock.type, doc="the socket type")
209 proto = property(lambda self: self._sock.proto, doc="the socket protocol")
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000210
Guido van Rossumc18993f2002-08-08 15:16:20 +0000211 _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
212 "%s.__doc__ = _realsocket.%s.__doc__\n")
Guido van Rossume5e50592001-08-18 01:23:20 +0000213 for _m in _socketmethods:
Guido van Rossumc18993f2002-08-08 15:16:20 +0000214 exec _s % (_m, _m, _m, _m)
Tim Petersd7e8a0d2002-08-08 20:07:03 +0000215 del _m, _s
Fred Drakea6070f02000-08-16 14:14:32 +0000216
Skip Montanaro89feabc2003-03-30 04:54:24 +0000217socket = SocketType = _socketobject
Fred Drakea6070f02000-08-16 14:14:32 +0000218
Guido van Rossumc18993f2002-08-08 15:16:20 +0000219class _fileobject(object):
Guido van Rossum443fec32002-08-08 01:02:16 +0000220 """Faux file object attached to a socket object."""
221
222 default_bufsize = 8192
Guido van Rossumc18993f2002-08-08 15:16:20 +0000223 name = "<socket>"
224
225 __slots__ = ["mode", "bufsize", "softspace",
226 # "closed" is a property, see below
Georg Brandldd7b0522007-01-21 10:35:10 +0000227 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf",
228 "_close"]
Fred Drakea6070f02000-08-16 14:14:32 +0000229
Georg Brandldd7b0522007-01-21 10:35:10 +0000230 def __init__(self, sock, mode='rb', bufsize=-1, close=False):
Fred Drakea6070f02000-08-16 14:14:32 +0000231 self._sock = sock
Guido van Rossumc18993f2002-08-08 15:16:20 +0000232 self.mode = mode # Not actually used in this version
Guido van Rossum443fec32002-08-08 01:02:16 +0000233 if bufsize < 0:
234 bufsize = self.default_bufsize
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000235 self.bufsize = bufsize
236 self.softspace = False
Guido van Rossum443fec32002-08-08 01:02:16 +0000237 if bufsize == 0:
238 self._rbufsize = 1
239 elif bufsize == 1:
240 self._rbufsize = self.default_bufsize
241 else:
242 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000243 self._wbufsize = bufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000244 self._rbuf = "" # A string
245 self._wbuf = [] # A list of strings
Georg Brandldd7b0522007-01-21 10:35:10 +0000246 self._close = close
Fred Drakea6070f02000-08-16 14:14:32 +0000247
Guido van Rossumc18993f2002-08-08 15:16:20 +0000248 def _getclosed(self):
Tim Peters116d83c2004-03-28 02:20:45 +0000249 return self._sock is None
Guido van Rossumc18993f2002-08-08 15:16:20 +0000250 closed = property(_getclosed, doc="True if the file is closed")
251
Fred Drakea6070f02000-08-16 14:14:32 +0000252 def close(self):
253 try:
254 if self._sock:
255 self.flush()
256 finally:
Georg Brandldd7b0522007-01-21 10:35:10 +0000257 if self._close:
258 self._sock.close()
Guido van Rossum67f7a382002-06-06 21:08:16 +0000259 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000260
261 def __del__(self):
Guido van Rossum65f8ced2003-05-29 14:36:57 +0000262 try:
263 self.close()
264 except:
265 # close() may fail if __init__ didn't complete
266 pass
Fred Drakea6070f02000-08-16 14:14:32 +0000267
268 def flush(self):
269 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000270 buffer = "".join(self._wbuf)
271 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000272 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000273
Neal Norwitz2b342902002-06-13 22:18:39 +0000274 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000275 return self._sock.fileno()
276
277 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000278 data = str(data) # XXX Should really reject non-string non-buffers
279 if not data:
280 return
281 self._wbuf.append(data)
282 if (self._wbufsize == 0 or
283 self._wbufsize == 1 and '\n' in data or
284 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000285 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000286
287 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000288 # XXX We could do better here for very long lists
289 # XXX Should really reject non-string non-buffers
290 self._wbuf.extend(filter(None, map(str, list)))
291 if (self._wbufsize <= 1 or
292 self._get_wbuf_len() >= self._wbufsize):
293 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000294
Guido van Rossum443fec32002-08-08 01:02:16 +0000295 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000296 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000297 for x in self._wbuf:
298 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000299 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000300
Guido van Rossum67f7a382002-06-06 21:08:16 +0000301 def read(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000302 data = self._rbuf
Guido van Rossum443fec32002-08-08 01:02:16 +0000303 if size < 0:
304 # Read until EOF
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000305 buffers = []
306 if data:
307 buffers.append(data)
308 self._rbuf = ""
Guido van Rossum443fec32002-08-08 01:02:16 +0000309 if self._rbufsize <= 1:
310 recv_size = self.default_bufsize
311 else:
312 recv_size = self._rbufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000313 while True:
Guido van Rossum443fec32002-08-08 01:02:16 +0000314 data = self._sock.recv(recv_size)
315 if not data:
316 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000317 buffers.append(data)
318 return "".join(buffers)
Guido van Rossum443fec32002-08-08 01:02:16 +0000319 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000320 # Read until size bytes or EOF seen, whichever comes first
321 buf_len = len(data)
322 if buf_len >= size:
323 self._rbuf = data[size:]
324 return data[:size]
325 buffers = []
326 if data:
327 buffers.append(data)
328 self._rbuf = ""
329 while True:
330 left = size - buf_len
331 recv_size = max(self._rbufsize, left)
Guido van Rossum443fec32002-08-08 01:02:16 +0000332 data = self._sock.recv(recv_size)
333 if not data:
334 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000335 buffers.append(data)
336 n = len(data)
337 if n >= left:
338 self._rbuf = data[left:]
339 buffers[-1] = data[:left]
340 break
341 buf_len += n
342 return "".join(buffers)
Fred Drakea6070f02000-08-16 14:14:32 +0000343
Guido van Rossum67f7a382002-06-06 21:08:16 +0000344 def readline(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000345 data = self._rbuf
346 if size < 0:
347 # Read until \n or EOF, whichever comes first
Guido van Rossum48b79692002-08-08 17:34:19 +0000348 if self._rbufsize <= 1:
349 # Speed up unbuffered case
350 assert data == ""
351 buffers = []
352 recv = self._sock.recv
353 while data != "\n":
354 data = recv(1)
355 if not data:
356 break
357 buffers.append(data)
358 return "".join(buffers)
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000359 nl = data.find('\n')
360 if nl >= 0:
361 nl += 1
362 self._rbuf = data[nl:]
363 return data[:nl]
364 buffers = []
365 if data:
366 buffers.append(data)
367 self._rbuf = ""
368 while True:
369 data = self._sock.recv(self._rbufsize)
370 if not data:
371 break
372 buffers.append(data)
373 nl = data.find('\n')
374 if nl >= 0:
375 nl += 1
376 self._rbuf = data[nl:]
377 buffers[-1] = data[:nl]
378 break
379 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000380 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000381 # Read until size bytes or \n or EOF seen, whichever comes first
382 nl = data.find('\n', 0, size)
383 if nl >= 0:
384 nl += 1
385 self._rbuf = data[nl:]
386 return data[:nl]
387 buf_len = len(data)
388 if buf_len >= size:
389 self._rbuf = data[size:]
390 return data[:size]
391 buffers = []
392 if data:
393 buffers.append(data)
394 self._rbuf = ""
395 while True:
396 data = self._sock.recv(self._rbufsize)
397 if not data:
398 break
399 buffers.append(data)
400 left = size - buf_len
401 nl = data.find('\n', 0, left)
402 if nl >= 0:
403 nl += 1
404 self._rbuf = data[nl:]
405 buffers[-1] = data[:nl]
406 break
407 n = len(data)
408 if n >= left:
409 self._rbuf = data[left:]
410 buffers[-1] = data[:left]
411 break
412 buf_len += n
413 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000414
415 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000416 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000417 list = []
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000418 while True:
Fred Drakea6070f02000-08-16 14:14:32 +0000419 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000420 if not line:
421 break
Fred Drakea6070f02000-08-16 14:14:32 +0000422 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000423 total += len(line)
424 if sizehint and total >= sizehint:
425 break
Fred Drakea6070f02000-08-16 14:14:32 +0000426 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000427
428 # Iterator protocols
429
430 def __iter__(self):
431 return self
432
433 def next(self):
434 line = self.readline()
435 if not line:
436 raise StopIteration
437 return line
Facundo Batista07c78be2007-03-23 18:54:07 +0000438
439
440def create_connection(address, timeout=None):
441 """Connect to address (host, port) with an optional timeout.
442
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000443 Provides access to socketobject timeout for higher-level
444 protocols. Passing a timeout will set the timeout on the
Facundo Batista07c78be2007-03-23 18:54:07 +0000445 socket instance (if not present, or passed as None, the
446 default global timeout setting will be used).
447 """
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000448
Facundo Batista07c78be2007-03-23 18:54:07 +0000449 msg = "getaddrinfo returns an empty list"
450 host, port = address
451 for res in getaddrinfo(host, port, 0, SOCK_STREAM):
452 af, socktype, proto, canonname, sa = res
453 sock = None
454 try:
455 sock = socket(af, socktype, proto)
456 if timeout is not None:
457 sock.settimeout(timeout)
458 sock.connect(sa)
459 return sock
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000460
Facundo Batista07c78be2007-03-23 18:54:07 +0000461 except error, msg:
462 if sock is not None:
463 sock.close()
464
465 raise error, msg