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
71 SSL_ERROR_ZERO_RETURN
, \
72 SSL_ERROR_WANT_READ
, \
73 SSL_ERROR_WANT_WRITE
, \
74 SSL_ERROR_WANT_X509_LOOKUP
, \
77 SSL_ERROR_WANT_CONNECT
, \
79 SSL_ERROR_INVALID_ERROR_CODE
81 from _ssl
import RAND_egd
83 # LibreSSL does not provide RAND_egd
86 import os
, sys
, warnings
89 from cStringIO
import StringIO
91 from StringIO
import StringIO
97 EBADF
= getattr(errno
, 'EBADF', 9)
98 EINTR
= getattr(errno
, 'EINTR', 4)
100 __all__
= ["getfqdn", "create_connection"]
101 __all__
.extend(os
._get
_exports
_list
(_socket
))
107 if sys
.platform
.lower().startswith("win"):
109 errorTab
[10004] = "The operation was interrupted."
110 errorTab
[10009] = "A bad file handle was passed."
111 errorTab
[10013] = "Permission denied."
112 errorTab
[10014] = "A fault occurred on the network??" # WSAEFAULT
113 errorTab
[10022] = "An invalid operation was attempted."
114 errorTab
[10035] = "The socket operation would block"
115 errorTab
[10036] = "A blocking operation is already in progress."
116 errorTab
[10048] = "The network address is in use."
117 errorTab
[10054] = "The connection has been reset."
118 errorTab
[10058] = "The network has been shut down."
119 errorTab
[10060] = "The operation timed out."
120 errorTab
[10061] = "Connection refused."
121 errorTab
[10063] = "The name is too long."
122 errorTab
[10064] = "The host is down."
123 errorTab
[10065] = "The host is unreachable."
124 __all__
.append("errorTab")
128 def getfqdn(name
=''):
129 """Get fully qualified domain name from name.
131 An empty argument is interpreted as meaning the local host.
133 First the hostname returned by gethostbyaddr() is checked, then
134 possibly existing aliases. In case no FQDN is available, hostname
135 from gethostname() is returned.
138 if not name
or name
== '0.0.0.0':
141 hostname
, aliases
, ipaddrs
= gethostbyaddr(name
)
145 aliases
.insert(0, hostname
)
155 'bind', 'connect', 'connect_ex', 'fileno', 'listen',
156 'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
157 'sendall', 'setblocking',
158 'settimeout', 'gettimeout', 'shutdown')
161 _socketmethods
= _socketmethods
+ ('ioctl',)
163 if sys
.platform
== "riscos":
164 _socketmethods
= _socketmethods
+ ('sleeptaskw',)
166 # All the method names that must be delegated to either the real socket
167 # object or the _closedsocket object.
168 _delegate_methods
= ("recv", "recvfrom", "recv_into", "recvfrom_into",
171 class _closedsocket(object):
174 raise error(EBADF
, 'Bad file descriptor')
175 # All _delegate_methods must also be initialized here.
176 send
= recv
= recv_into
= sendto
= recvfrom
= recvfrom_into
= _dummy
179 # Wrapper around platform socket objects. This implements
180 # a platform-independent dup() functionality. The
181 # implementation currently relies on reference counting
182 # to close the underlying socket object.
183 class _socketobject(object):
185 __doc__
= _realsocket
.__doc
__
187 __slots__
= ["_sock", "__weakref__"] + list(_delegate_methods
)
189 def __init__(self
, family
=AF_INET
, type=SOCK_STREAM
, proto
=0, _sock
=None):
191 _sock
= _realsocket(family
, type, proto
)
193 for method
in _delegate_methods
:
194 setattr(self
, method
, getattr(_sock
, method
))
196 def close(self
, _closedsocket
=_closedsocket
,
197 _delegate_methods
=_delegate_methods
, setattr=setattr):
198 # This function should not reference any globals. See issue #808164.
199 self
._sock
= _closedsocket()
200 dummy
= self
._sock
._dummy
201 for method
in _delegate_methods
:
202 setattr(self
, method
, dummy
)
203 close
.__doc
__ = _realsocket
.close
.__doc
__
206 sock
, addr
= self
._sock
.accept()
207 return _socketobject(_sock
=sock
), addr
208 accept
.__doc
__ = _realsocket
.accept
.__doc
__
211 """dup() -> socket object
213 Return a new socket object connected to the same system resource."""
214 return _socketobject(_sock
=self
._sock
)
216 def makefile(self
, mode
='r', bufsize
=-1):
217 """makefile([mode[, bufsize]]) -> file object
219 Return a regular file object corresponding to the socket. The mode
220 and bufsize arguments are as for the built-in open() function."""
221 return _fileobject(self
._sock
, mode
, bufsize
)
223 family
= property(lambda self
: self
._sock
.family
, doc
="the socket family")
224 type = property(lambda self
: self
._sock
.type, doc
="the socket type")
225 proto
= property(lambda self
: self
._sock
.proto
, doc
="the socket protocol")
227 def meth(name
,self
,*args
):
228 return getattr(self
._sock
,name
)(*args
)
230 for _m
in _socketmethods
:
233 p
.__doc
__ = getattr(_realsocket
,_m
).__doc
__
234 m
= MethodType(p
,None,_socketobject
)
235 setattr(_socketobject
,_m
,m
)
237 socket
= SocketType
= _socketobject
239 class _fileobject(object):
240 """Faux file object attached to a socket object."""
242 default_bufsize
= 8192
245 __slots__
= ["mode", "bufsize", "softspace",
246 # "closed" is a property, see below
247 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf", "_wbuf_len",
250 def __init__(self
, sock
, mode
='rb', bufsize
=-1, close
=False):
252 self
.mode
= mode
# Not actually used in this version
254 bufsize
= self
.default_bufsize
255 self
.bufsize
= bufsize
256 self
.softspace
= False
257 # _rbufsize is the suggested recv buffer size. It is *strictly*
258 # obeyed within readline() for recv calls. If it is larger than
259 # default_bufsize it will be used for recv calls within read().
263 self
._rbufsize
= self
.default_bufsize
265 self
._rbufsize
= bufsize
266 self
._wbufsize
= bufsize
267 # We use StringIO for the read buffer to avoid holding a list
268 # of variously sized string objects which have been known to
269 # fragment the heap due to how they are malloc()ed and often
270 # realloc()ed down much smaller than their original allocation.
271 self
._rbuf
= StringIO()
272 self
._wbuf
= [] # A list of strings
276 def _getclosed(self
):
277 return self
._sock
is None
278 closed
= property(_getclosed
, doc
="True if the file is closed")
293 # close() may fail if __init__ didn't complete
298 data
= "".join(self
._wbuf
)
301 buffer_size
= max(self
._rbufsize
, self
.default_bufsize
)
302 data_size
= len(data
)
304 view
= memoryview(data
)
306 while write_offset
< data_size
:
307 self
._sock
.sendall(view
[write_offset
:write_offset
+buffer_size
])
308 write_offset
+= buffer_size
310 if write_offset
< data_size
:
311 remainder
= data
[write_offset
:]
312 del view
, data
# explicit free
313 self
._wbuf
.append(remainder
)
314 self
._wbuf
_len
= len(remainder
)
317 return self
._sock
.fileno()
319 def write(self
, data
):
320 data
= str(data
) # XXX Should really reject non-string non-buffers
323 self
._wbuf
.append(data
)
324 self
._wbuf
_len
+= len(data
)
325 if (self
._wbufsize
== 0 or
326 (self
._wbufsize
== 1 and '\n' in data
) or
327 (self
._wbufsize
> 1 and self
._wbuf
_len
>= self
._wbufsize
)):
330 def writelines(self
, list):
331 # XXX We could do better here for very long lists
332 # XXX Should really reject non-string non-buffers
333 lines
= filter(None, map(str, list))
334 self
._wbuf
_len
+= sum(map(len, lines
))
335 self
._wbuf
.extend(lines
)
336 if (self
._wbufsize
<= 1 or
337 self
._wbuf
_len
>= self
._wbufsize
):
340 def read(self
, size
=-1):
341 # Use max, disallow tiny reads in a loop as they are very inefficient.
342 # We never leave read() with any leftover data from a new recv() call
343 # in our internal buffer.
344 rbufsize
= max(self
._rbufsize
, self
.default_bufsize
)
345 # Our use of StringIO rather than lists of string objects returned by
346 # recv() minimizes memory usage and fragmentation that occurs when
347 # rbufsize is large compared to the typical return value of recv().
349 buf
.seek(0, 2) # seek end
352 self
._rbuf
= StringIO() # reset _rbuf. we consume it via buf.
355 data
= self
._sock
.recv(rbufsize
)
357 if e
.args
[0] == EINTR
:
363 return buf
.getvalue()
365 # Read until size bytes or EOF seen, whichever comes first
368 # Already have size bytes in our buffer? Extract and return.
371 self
._rbuf
= StringIO()
372 self
._rbuf
.write(buf
.read())
375 self
._rbuf
= StringIO() # reset _rbuf. we consume it via buf.
377 left
= size
- buf_len
378 # recv() will malloc the amount of memory given as its
379 # parameter even though it often returns much less data
380 # than that. The returned data string is short lived
381 # as we copy it into a StringIO and free it. This avoids
382 # fragmentation issues on many platforms.
384 data
= self
._sock
.recv(left
)
386 if e
.args
[0] == EINTR
:
392 if n
== size
and not buf_len
:
393 # Shortcut. Avoid buffer data copies when:
394 # - We have no data in our buffer.
396 # - Our call to recv returned exactly the
397 # number of bytes we were asked to read.
401 del data
# explicit free
403 assert n
<= left
, "recv(%d) returned %d bytes" % (left
, n
)
406 del data
# explicit free
407 #assert buf_len == buf.tell()
408 return buf
.getvalue()
410 def readline(self
, size
=-1):
412 buf
.seek(0, 2) # seek end
414 # check if we already have it in our buffer
416 bline
= buf
.readline(size
)
417 if bline
.endswith('\n') or len(bline
) == size
:
418 self
._rbuf
= StringIO()
419 self
._rbuf
.write(buf
.read())
423 # Read until \n or EOF, whichever comes first
424 if self
._rbufsize
<= 1:
425 # Speed up unbuffered case
427 buffers
= [buf
.read()]
428 self
._rbuf
= StringIO() # reset _rbuf. we consume it via buf.
430 recv
= self
._sock
.recv
439 # The try..except to catch EINTR was moved outside the
440 # recv loop to avoid the per byte overhead.
441 if e
.args
[0] == EINTR
:
445 return "".join(buffers
)
447 buf
.seek(0, 2) # seek end
448 self
._rbuf
= StringIO() # reset _rbuf. we consume it via buf.
451 data
= self
._sock
.recv(self
._rbufsize
)
453 if e
.args
[0] == EINTR
:
462 self
._rbuf
.write(data
[nl
:])
466 return buf
.getvalue()
468 # Read until size bytes or \n or EOF seen, whichever comes first
469 buf
.seek(0, 2) # seek end
474 self
._rbuf
= StringIO()
475 self
._rbuf
.write(buf
.read())
477 self
._rbuf
= StringIO() # reset _rbuf. we consume it via buf.
480 data
= self
._sock
.recv(self
._rbufsize
)
482 if e
.args
[0] == EINTR
:
487 left
= size
- buf_len
488 # did we just receive a newline?
489 nl
= data
.find('\n', 0, left
)
492 # save the excess data to _rbuf
493 self
._rbuf
.write(data
[nl
:])
498 # Shortcut. Avoid data copy through buf when returning
499 # a substring of our first recv().
502 if n
== size
and not buf_len
:
503 # Shortcut. Avoid data copy through buf when
504 # returning exactly all of our first recv().
507 buf
.write(data
[:left
])
508 self
._rbuf
.write(data
[left
:])
512 #assert buf_len == buf.tell()
513 return buf
.getvalue()
515 def readlines(self
, sizehint
=0):
519 line
= self
.readline()
524 if sizehint
and total
>= sizehint
:
534 line
= self
.readline()
539 _GLOBAL_DEFAULT_TIMEOUT
= object()
541 def create_connection(address
, timeout
=_GLOBAL_DEFAULT_TIMEOUT
,
542 source_address
=None):
543 """Connect to *address* and return the socket object.
545 Convenience function. Connect to *address* (a 2-tuple ``(host,
546 port)``) and return the socket object. Passing the optional
547 *timeout* parameter will set the timeout on the socket instance
548 before attempting to connect. If no *timeout* is supplied, the
549 global default timeout setting returned by :func:`getdefaulttimeout`
550 is used. If *source_address* is set it must be a tuple of (host, port)
551 for the socket to bind as a source address before making the connection.
552 An host of '' or port 0 tells the OS to use the default.
557 for res
in getaddrinfo(host
, port
, 0, SOCK_STREAM
):
558 af
, socktype
, proto
, canonname
, sa
= res
561 sock
= socket(af
, socktype
, proto
)
562 if timeout
is not _GLOBAL_DEFAULT_TIMEOUT
:
563 sock
.settimeout(timeout
)
565 sock
.bind(source_address
)
577 raise error("getaddrinfo returns an empty list")