1 # Wrapper module for _socket, providing some additional facilities
2 # implemented in Python.
5 This module provides socket operations and some related functions.
6 On Unix, it supports IP (Internet Protocol) and Unix domain sockets.
7 On other systems, it only supports IP. Functions specific for a
8 socket are available as methods of the socket object.
12 socket() -- create a new socket object
13 socketpair() -- create a pair of new socket objects [*]
14 fromfd() -- create a socket object from an open file descriptor [*]
15 gethostname() -- return the current hostname
16 gethostbyname() -- map a hostname to its IP number
17 gethostbyaddr() -- map an IP number or hostname to DNS info
18 getservbyname() -- map a service name and a protocol name to a port number
19 getprotobyname() -- map a protocol name (e.g. 'tcp') to a number
20 ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order
21 htons(), htonl() -- convert 16, 32 bit int from host to network byte order
22 inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format
23 inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)
24 ssl() -- secure socket layer support (only available if configured)
25 socket.getdefaulttimeout() -- get the default timeout value
26 socket.setdefaulttimeout() -- set the default timeout value
27 create_connection() -- connects to an address, with an optional timeout and
28 optional source address.
30 [*] not available on all platforms!
34 SocketType -- type object for socket objects
35 error -- exception raised for I/O errors
36 has_ipv6 -- boolean value indicating if IPv6 is supported
40 AF_INET, AF_UNIX -- socket domains (first argument to socket() call)
41 SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)
43 Many other constants may be defined; these may be used in calls to
44 the setsockopt() and getsockopt() methods.
49 from functools
import partial
50 from types
import MethodType
58 def ssl(sock
, keyfile
=None, certfile
=None):
59 # we do an internal import here because the ssl
60 # module imports the socket module
61 import ssl
as _realssl
62 warnings
.warn("socket.ssl() is deprecated. Use ssl.wrap_socket() instead.",
63 DeprecationWarning, stacklevel
=2)
64 return _realssl
.sslwrap_simple(sock
, keyfile
, certfile
)
66 # we need to import the same constants we used to...
67 from _ssl
import SSLError
as sslerror
72 SSL_ERROR_ZERO_RETURN
, \
73 SSL_ERROR_WANT_READ
, \
74 SSL_ERROR_WANT_WRITE
, \
75 SSL_ERROR_WANT_X509_LOOKUP
, \
78 SSL_ERROR_WANT_CONNECT
, \
80 SSL_ERROR_INVALID_ERROR_CODE
82 import os
, sys
, warnings
85 from cStringIO
import StringIO
87 from StringIO
import StringIO
93 EBADF
= getattr(errno
, 'EBADF', 9)
94 EINTR
= getattr(errno
, 'EINTR', 4)
96 __all__
= ["getfqdn", "create_connection"]
97 __all__
.extend(os
._get
_exports
_list
(_socket
))
103 if sys
.platform
.lower().startswith("win"):
105 errorTab
[10004] = "The operation was interrupted."
106 errorTab
[10009] = "A bad file handle was passed."
107 errorTab
[10013] = "Permission denied."
108 errorTab
[10014] = "A fault occurred on the network??" # WSAEFAULT
109 errorTab
[10022] = "An invalid operation was attempted."
110 errorTab
[10035] = "The socket operation would block"
111 errorTab
[10036] = "A blocking operation is already in progress."
112 errorTab
[10048] = "The network address is in use."
113 errorTab
[10054] = "The connection has been reset."
114 errorTab
[10058] = "The network has been shut down."
115 errorTab
[10060] = "The operation timed out."
116 errorTab
[10061] = "Connection refused."
117 errorTab
[10063] = "The name is too long."
118 errorTab
[10064] = "The host is down."
119 errorTab
[10065] = "The host is unreachable."
120 __all__
.append("errorTab")
124 def getfqdn(name
=''):
125 """Get fully qualified domain name from name.
127 An empty argument is interpreted as meaning the local host.
129 First the hostname returned by gethostbyaddr() is checked, then
130 possibly existing aliases. In case no FQDN is available, hostname
131 from gethostname() is returned.
134 if not name
or name
== '0.0.0.0':
137 hostname
, aliases
, ipaddrs
= gethostbyaddr(name
)
141 aliases
.insert(0, hostname
)
151 'bind', 'connect', 'connect_ex', 'fileno', 'listen',
152 'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
153 'sendall', 'setblocking',
154 'settimeout', 'gettimeout', 'shutdown')
157 _socketmethods
= _socketmethods
+ ('ioctl',)
159 if sys
.platform
== "riscos":
160 _socketmethods
= _socketmethods
+ ('sleeptaskw',)
162 # All the method names that must be delegated to either the real socket
163 # object or the _closedsocket object.
164 _delegate_methods
= ("recv", "recvfrom", "recv_into", "recvfrom_into",
167 class _closedsocket(object):
170 raise error(EBADF
, 'Bad file descriptor')
171 # All _delegate_methods must also be initialized here.
172 send
= recv
= recv_into
= sendto
= recvfrom
= recvfrom_into
= _dummy
175 # Wrapper around platform socket objects. This implements
176 # a platform-independent dup() functionality. The
177 # implementation currently relies on reference counting
178 # to close the underlying socket object.
179 class _socketobject(object):
181 __doc__
= _realsocket
.__doc
__
183 __slots__
= ["_sock", "__weakref__"] + list(_delegate_methods
)
185 def __init__(self
, family
=AF_INET
, type=SOCK_STREAM
, proto
=0, _sock
=None):
187 _sock
= _realsocket(family
, type, proto
)
189 for method
in _delegate_methods
:
190 setattr(self
, method
, getattr(_sock
, method
))
192 def close(self
, _closedsocket
=_closedsocket
,
193 _delegate_methods
=_delegate_methods
, setattr=setattr):
194 # This function should not reference any globals. See issue #808164.
195 self
._sock
= _closedsocket()
196 dummy
= self
._sock
._dummy
197 for method
in _delegate_methods
:
198 setattr(self
, method
, dummy
)
199 close
.__doc
__ = _realsocket
.close
.__doc
__
202 sock
, addr
= self
._sock
.accept()
203 return _socketobject(_sock
=sock
), addr
204 accept
.__doc
__ = _realsocket
.accept
.__doc
__
207 """dup() -> socket object
209 Return a new socket object connected to the same system resource."""
210 return _socketobject(_sock
=self
._sock
)
212 def makefile(self
, mode
='r', bufsize
=-1):
213 """makefile([mode[, bufsize]]) -> file object
215 Return a regular file object corresponding to the socket. The mode
216 and bufsize arguments are as for the built-in open() function."""
217 return _fileobject(self
._sock
, mode
, bufsize
)
219 family
= property(lambda self
: self
._sock
.family
, doc
="the socket family")
220 type = property(lambda self
: self
._sock
.type, doc
="the socket type")
221 proto
= property(lambda self
: self
._sock
.proto
, doc
="the socket protocol")
223 def meth(name
,self
,*args
):
224 return getattr(self
._sock
,name
)(*args
)
226 for _m
in _socketmethods
:
229 p
.__doc
__ = getattr(_realsocket
,_m
).__doc
__
230 m
= MethodType(p
,None,_socketobject
)
231 setattr(_socketobject
,_m
,m
)
233 socket
= SocketType
= _socketobject
235 class _fileobject(object):
236 """Faux file object attached to a socket object."""
238 default_bufsize
= 8192
241 __slots__
= ["mode", "bufsize", "softspace",
242 # "closed" is a property, see below
243 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf", "_wbuf_len",
246 def __init__(self
, sock
, mode
='rb', bufsize
=-1, close
=False):
248 self
.mode
= mode
# Not actually used in this version
250 bufsize
= self
.default_bufsize
251 self
.bufsize
= bufsize
252 self
.softspace
= False
253 # _rbufsize is the suggested recv buffer size. It is *strictly*
254 # obeyed within readline() for recv calls. If it is larger than
255 # default_bufsize it will be used for recv calls within read().
259 self
._rbufsize
= self
.default_bufsize
261 self
._rbufsize
= bufsize
262 self
._wbufsize
= bufsize
263 # We use StringIO for the read buffer to avoid holding a list
264 # of variously sized string objects which have been known to
265 # fragment the heap due to how they are malloc()ed and often
266 # realloc()ed down much smaller than their original allocation.
267 self
._rbuf
= StringIO()
268 self
._wbuf
= [] # A list of strings
272 def _getclosed(self
):
273 return self
._sock
is None
274 closed
= property(_getclosed
, doc
="True if the file is closed")
289 # close() may fail if __init__ didn't complete
294 data
= "".join(self
._wbuf
)
297 buffer_size
= max(self
._rbufsize
, self
.default_bufsize
)
298 data_size
= len(data
)
300 view
= memoryview(data
)
302 while write_offset
< data_size
:
303 self
._sock
.sendall(view
[write_offset
:write_offset
+buffer_size
])
304 write_offset
+= buffer_size
306 if write_offset
< data_size
:
307 remainder
= data
[write_offset
:]
308 del view
, data
# explicit free
309 self
._wbuf
.append(remainder
)
310 self
._wbuf
_len
= len(remainder
)
313 return self
._sock
.fileno()
315 def write(self
, data
):
316 data
= str(data
) # XXX Should really reject non-string non-buffers
319 self
._wbuf
.append(data
)
320 self
._wbuf
_len
+= len(data
)
321 if (self
._wbufsize
== 0 or
322 self
._wbufsize
== 1 and '\n' in data
or
323 self
._wbuf
_len
>= self
._wbufsize
):
326 def writelines(self
, list):
327 # XXX We could do better here for very long lists
328 # XXX Should really reject non-string non-buffers
329 lines
= filter(None, map(str, list))
330 self
._wbuf
_len
+= sum(map(len, lines
))
331 self
._wbuf
.extend(lines
)
332 if (self
._wbufsize
<= 1 or
333 self
._wbuf
_len
>= self
._wbufsize
):
336 def read(self
, size
=-1):
337 # Use max, disallow tiny reads in a loop as they are very inefficient.
338 # We never leave read() with any leftover data from a new recv() call
339 # in our internal buffer.
340 rbufsize
= max(self
._rbufsize
, self
.default_bufsize
)
341 # Our use of StringIO rather than lists of string objects returned by
342 # recv() minimizes memory usage and fragmentation that occurs when
343 # rbufsize is large compared to the typical return value of recv().
345 buf
.seek(0, 2) # seek end
348 self
._rbuf
= StringIO() # reset _rbuf. we consume it via buf.
351 data
= self
._sock
.recv(rbufsize
)
353 if e
.args
[0] == EINTR
:
359 return buf
.getvalue()
361 # Read until size bytes or EOF seen, whichever comes first
364 # Already have size bytes in our buffer? Extract and return.
367 self
._rbuf
= StringIO()
368 self
._rbuf
.write(buf
.read())
371 self
._rbuf
= StringIO() # reset _rbuf. we consume it via buf.
373 left
= size
- buf_len
374 # recv() will malloc the amount of memory given as its
375 # parameter even though it often returns much less data
376 # than that. The returned data string is short lived
377 # as we copy it into a StringIO and free it. This avoids
378 # fragmentation issues on many platforms.
380 data
= self
._sock
.recv(left
)
382 if e
.args
[0] == EINTR
:
388 if n
== size
and not buf_len
:
389 # Shortcut. Avoid buffer data copies when:
390 # - We have no data in our buffer.
392 # - Our call to recv returned exactly the
393 # number of bytes we were asked to read.
397 del data
# explicit free
399 assert n
<= left
, "recv(%d) returned %d bytes" % (left
, n
)
402 del data
# explicit free
403 #assert buf_len == buf.tell()
404 return buf
.getvalue()
406 def readline(self
, size
=-1):
408 buf
.seek(0, 2) # seek end
410 # check if we already have it in our buffer
412 bline
= buf
.readline(size
)
413 if bline
.endswith('\n') or len(bline
) == size
:
414 self
._rbuf
= StringIO()
415 self
._rbuf
.write(buf
.read())
419 # Read until \n or EOF, whichever comes first
420 if self
._rbufsize
<= 1:
421 # Speed up unbuffered case
423 buffers
= [buf
.read()]
424 self
._rbuf
= StringIO() # reset _rbuf. we consume it via buf.
426 recv
= self
._sock
.recv
435 # The try..except to catch EINTR was moved outside the
436 # recv loop to avoid the per byte overhead.
437 if e
.args
[0] == EINTR
:
441 return "".join(buffers
)
443 buf
.seek(0, 2) # seek end
444 self
._rbuf
= StringIO() # reset _rbuf. we consume it via buf.
447 data
= self
._sock
.recv(self
._rbufsize
)
449 if e
.args
[0] == EINTR
:
458 self
._rbuf
.write(data
[nl
:])
462 return buf
.getvalue()
464 # Read until size bytes or \n or EOF seen, whichever comes first
465 buf
.seek(0, 2) # seek end
470 self
._rbuf
= StringIO()
471 self
._rbuf
.write(buf
.read())
473 self
._rbuf
= StringIO() # reset _rbuf. we consume it via buf.
476 data
= self
._sock
.recv(self
._rbufsize
)
478 if e
.args
[0] == EINTR
:
483 left
= size
- buf_len
484 # did we just receive a newline?
485 nl
= data
.find('\n', 0, left
)
488 # save the excess data to _rbuf
489 self
._rbuf
.write(data
[nl
:])
494 # Shortcut. Avoid data copy through buf when returning
495 # a substring of our first recv().
498 if n
== size
and not buf_len
:
499 # Shortcut. Avoid data copy through buf when
500 # returning exactly all of our first recv().
503 buf
.write(data
[:left
])
504 self
._rbuf
.write(data
[left
:])
508 #assert buf_len == buf.tell()
509 return buf
.getvalue()
511 def readlines(self
, sizehint
=0):
515 line
= self
.readline()
520 if sizehint
and total
>= sizehint
:
530 line
= self
.readline()
535 _GLOBAL_DEFAULT_TIMEOUT
= object()
537 def create_connection(address
, timeout
=_GLOBAL_DEFAULT_TIMEOUT
,
538 source_address
=None):
539 """Connect to *address* and return the socket object.
541 Convenience function. Connect to *address* (a 2-tuple ``(host,
542 port)``) and return the socket object. Passing the optional
543 *timeout* parameter will set the timeout on the socket instance
544 before attempting to connect. If no *timeout* is supplied, the
545 global default timeout setting returned by :func:`getdefaulttimeout`
546 is used. If *source_address* is set it must be a tuple of (host, port)
547 for the socket to bind as a source address before making the connection.
548 An host of '' or port 0 tells the OS to use the default.
553 for res
in getaddrinfo(host
, port
, 0, SOCK_STREAM
):
554 af
, socktype
, proto
, canonname
, sa
= res
557 sock
= socket(af
, socktype
, proto
)
558 if timeout
is not _GLOBAL_DEFAULT_TIMEOUT
:
559 sock
.settimeout(timeout
)
561 sock
.bind(source_address
)
573 raise error("getaddrinfo returns an empty list")