blob: ca3d21cb653a74bb4c0470f5790295cb2fabfac9 [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 [*]
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000015fromshare() -- create a socket object from data received from socket.share() [*]
Fred Drakea6070f02000-08-16 14:14:32 +000016gethostname() -- return the current hostname
17gethostbyname() -- map a hostname to its IP number
18gethostbyaddr() -- map an IP number or hostname to DNS info
19getservbyname() -- map a service name and a protocol name to a port number
Mark Dickinson5c91bf32009-06-02 07:41:26 +000020getprotobyname() -- map a protocol name (e.g. 'tcp') to a number
Fred Drakea6070f02000-08-16 14:14:32 +000021ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order
22htons(), htonl() -- convert 16, 32 bit int from host to network byte order
23inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format
24inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000025socket.getdefaulttimeout() -- get the default timeout value
26socket.setdefaulttimeout() -- set the default timeout value
Gregory P. Smithb4066372010-01-03 03:28:29 +000027create_connection() -- connects to an address, with an optional timeout and
28 optional source address.
Fred Drakea6070f02000-08-16 14:14:32 +000029
30 [*] not available on all platforms!
31
32Special objects:
33
34SocketType -- type object for socket objects
35error -- exception raised for I/O errors
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000036has_ipv6 -- boolean value indicating if IPv6 is supported
Fred Drakea6070f02000-08-16 14:14:32 +000037
38Integer constants:
39
40AF_INET, AF_UNIX -- socket domains (first argument to socket() call)
41SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)
42
43Many other constants may be defined; these may be used in calls to
44the setsockopt() and getsockopt() methods.
45"""
46
Tim Peters18e67782002-02-17 04:25:24 +000047import _socket
Fred Drakea6070f02000-08-16 14:14:32 +000048from _socket import *
Tim Peters18e67782002-02-17 04:25:24 +000049
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020050import os, sys, io, selectors
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -070051from enum import IntEnum
Fred Drakea6070f02000-08-16 14:14:32 +000052
Fred Drake70d566b2003-04-29 19:50:25 +000053try:
Gregory P. Smithaafdca82010-01-04 04:50:36 +000054 import errno
Brett Cannoncd171c82013-07-04 17:43:24 -040055except ImportError:
Gregory P. Smithaafdca82010-01-04 04:50:36 +000056 errno = None
57EBADF = getattr(errno, 'EBADF', 9)
Antoine Pitrou98b46702010-09-18 22:59:00 +000058EAGAIN = getattr(errno, 'EAGAIN', 11)
59EWOULDBLOCK = getattr(errno, 'EWOULDBLOCK', 11)
Fred Drake70d566b2003-04-29 19:50:25 +000060
Benjamin Petersonef3e4c22009-04-11 19:48:14 +000061__all__ = ["getfqdn", "create_connection"]
Skip Montanaro0de65802001-02-15 22:15:14 +000062__all__.extend(os._get_exports_list(_socket))
Thomas Wouters47b49bf2007-08-30 22:15:33 +000063
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -070064# Set up the socket.AF_* socket.SOCK_* constants as members of IntEnums for
65# nicer string representations.
66# Note that _socket only knows about the integer values. The public interface
67# in this module understands the enums and translates them back from integers
68# where needed (e.g. .family property of a socket object).
69AddressFamily = IntEnum('AddressFamily',
70 {name: value for name, value in globals().items()
71 if name.isupper() and name.startswith('AF_')})
72globals().update(AddressFamily.__members__)
73
74SocketType = IntEnum('SocketType',
75 {name: value for name, value in globals().items()
76 if name.isupper() and name.startswith('SOCK_')})
77globals().update(SocketType.__members__)
78
Charles-François Natali98c745a2014-10-14 21:22:44 +010079
80_LOCALHOST = '127.0.0.1'
81_LOCALHOST_V6 = '::1'
82
83
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -070084def _intenum_converter(value, enum_klass):
85 """Convert a numeric family value to an IntEnum member.
86
87 If it's not a known member, return the numeric value itself.
88 """
89 try:
90 return enum_klass(value)
91 except ValueError:
92 return value
Thomas Wouters47b49bf2007-08-30 22:15:33 +000093
94_realsocket = socket
Skip Montanaro0de65802001-02-15 22:15:14 +000095
Fred Drakea6070f02000-08-16 14:14:32 +000096# WSA error codes
97if sys.platform.lower().startswith("win"):
98 errorTab = {}
99 errorTab[10004] = "The operation was interrupted."
100 errorTab[10009] = "A bad file handle was passed."
101 errorTab[10013] = "Permission denied."
102 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
103 errorTab[10022] = "An invalid operation was attempted."
104 errorTab[10035] = "The socket operation would block"
105 errorTab[10036] = "A blocking operation is already in progress."
106 errorTab[10048] = "The network address is in use."
107 errorTab[10054] = "The connection has been reset."
108 errorTab[10058] = "The network has been shut down."
109 errorTab[10060] = "The operation timed out."
110 errorTab[10061] = "Connection refused."
111 errorTab[10063] = "The name is too long."
112 errorTab[10064] = "The host is down."
113 errorTab[10065] = "The host is unreachable."
Skip Montanaro64de1a42001-03-18 19:53:21 +0000114 __all__.append("errorTab")
Guido van Rossumde7cade2002-08-08 15:25:28 +0000115
Fred Drakea6070f02000-08-16 14:14:32 +0000116
Giampaolo Rodola'915d1412014-06-11 03:54:30 +0200117class _GiveupOnSendfile(Exception): pass
118
119
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000120class socket(_socket.socket):
121
122 """A subclass of _socket.socket adding the makefile() method."""
123
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000124 __slots__ = ["__weakref__", "_io_refs", "_closed"]
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000125
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000126 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -0700127 # For user code address family and type values are IntEnum members, but
128 # for the underlying _socket.socket they're just integers. The
129 # constructor of _socket.socket converts the given argument to an
130 # integer automatically.
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000131 _socket.socket.__init__(self, family, type, proto, fileno)
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000132 self._io_refs = 0
133 self._closed = False
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000134
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +0000135 def __enter__(self):
136 return self
137
138 def __exit__(self, *args):
139 if not self._closed:
140 self.close()
141
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000142 def __repr__(self):
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200143 """Wrap __repr__() to reveal the real class name and socket
144 address(es).
145 """
146 closed = getattr(self, '_closed', False)
Giampaolo Rodola'b6281492013-10-03 21:01:43 +0200147 s = "<%s.%s%s fd=%i, family=%s, type=%s, proto=%i" \
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200148 % (self.__class__.__module__,
Serhiy Storchaka521e5862014-07-22 15:00:37 +0300149 self.__class__.__qualname__,
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200150 " [closed]" if closed else "",
151 self.fileno(),
152 self.family,
153 self.type,
154 self.proto)
155 if not closed:
156 try:
157 laddr = self.getsockname()
158 if laddr:
159 s += ", laddr=%s" % str(laddr)
160 except error:
161 pass
162 try:
163 raddr = self.getpeername()
164 if raddr:
165 s += ", raddr=%s" % str(raddr)
166 except error:
167 pass
168 s += '>'
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000169 return s
170
Antoine Pitrou6d58d642011-03-20 23:56:36 +0100171 def __getstate__(self):
172 raise TypeError("Cannot serialize socket object")
173
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000174 def dup(self):
175 """dup() -> socket object
176
Victor Stinnerdaf45552013-08-28 00:53:59 +0200177 Duplicate the socket. Return a new socket object connected to the same
178 system resource. The new socket is non-inheritable.
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000179 """
180 fd = dup(self.fileno())
181 sock = self.__class__(self.family, self.type, self.proto, fileno=fd)
182 sock.settimeout(self.gettimeout())
183 return sock
184
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000185 def accept(self):
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000186 """accept() -> (socket object, address info)
187
188 Wait for an incoming connection. Return a new socket
189 representing the connection, and the address of the client.
190 For IP sockets, the address info is a pair (hostaddr, port).
191 """
192 fd, addr = self._accept()
Antoine Pitrou600232b2011-01-05 21:03:42 +0000193 sock = socket(self.family, self.type, self.proto, fileno=fd)
194 # Issue #7995: if no default timeout is set and the listening
195 # socket had a (non-zero) timeout, force the new socket in blocking
196 # mode to override platform-specific socket flags inheritance.
197 if getdefaulttimeout() is None and self.gettimeout():
198 sock.setblocking(True)
199 return sock, addr
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000200
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000201 def makefile(self, mode="r", buffering=None, *,
Antoine Pitrou834bd812010-10-13 16:17:14 +0000202 encoding=None, errors=None, newline=None):
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000203 """makefile(...) -> an I/O stream connected to the socket
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000204
205 The arguments are as for io.open() after the filename,
206 except the only mode characters supported are 'r', 'w' and 'b'.
207 The semantics are similar too. (XXX refactor to share code?)
208 """
209 for c in mode:
210 if c not in {"r", "w", "b"}:
211 raise ValueError("invalid mode %r (only r, w, b allowed)")
212 writing = "w" in mode
213 reading = "r" in mode or not writing
214 assert reading or writing
215 binary = "b" in mode
216 rawmode = ""
217 if reading:
218 rawmode += "r"
219 if writing:
220 rawmode += "w"
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000221 raw = SocketIO(self, rawmode)
222 self._io_refs += 1
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000223 if buffering is None:
224 buffering = -1
225 if buffering < 0:
226 buffering = io.DEFAULT_BUFFER_SIZE
227 if buffering == 0:
228 if not binary:
229 raise ValueError("unbuffered streams must be binary")
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000230 return raw
231 if reading and writing:
232 buffer = io.BufferedRWPair(raw, raw, buffering)
233 elif reading:
234 buffer = io.BufferedReader(raw, buffering)
235 else:
236 assert writing
237 buffer = io.BufferedWriter(raw, buffering)
238 if binary:
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000239 return buffer
Antoine Pitrou834bd812010-10-13 16:17:14 +0000240 text = io.TextIOWrapper(buffer, encoding, errors, newline)
Guido van Rossum93adc5d2007-07-17 20:41:19 +0000241 text.mode = mode
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000242 return text
243
Giampaolo Rodola'915d1412014-06-11 03:54:30 +0200244 if hasattr(os, 'sendfile'):
245
246 def _sendfile_use_sendfile(self, file, offset=0, count=None):
247 self._check_sendfile_params(file, offset, count)
248 sockno = self.fileno()
249 try:
250 fileno = file.fileno()
251 except (AttributeError, io.UnsupportedOperation) as err:
252 raise _GiveupOnSendfile(err) # not a regular file
253 try:
254 fsize = os.fstat(fileno).st_size
255 except OSError:
256 raise _GiveupOnSendfile(err) # not a regular file
257 if not fsize:
258 return 0 # empty file
259 blocksize = fsize if not count else count
260
261 timeout = self.gettimeout()
262 if timeout == 0:
263 raise ValueError("non-blocking sockets are not supported")
264 # poll/select have the advantage of not requiring any
265 # extra file descriptor, contrarily to epoll/kqueue
266 # (also, they require a single syscall).
267 if hasattr(selectors, 'PollSelector'):
268 selector = selectors.PollSelector()
269 else:
270 selector = selectors.SelectSelector()
271 selector.register(sockno, selectors.EVENT_WRITE)
272
273 total_sent = 0
274 # localize variable access to minimize overhead
275 selector_select = selector.select
276 os_sendfile = os.sendfile
277 try:
278 while True:
279 if timeout and not selector_select(timeout):
280 raise _socket.timeout('timed out')
281 if count:
282 blocksize = count - total_sent
283 if blocksize <= 0:
284 break
285 try:
286 sent = os_sendfile(sockno, fileno, offset, blocksize)
287 except BlockingIOError:
288 if not timeout:
289 # Block until the socket is ready to send some
290 # data; avoids hogging CPU resources.
291 selector_select()
292 continue
293 except OSError as err:
294 if total_sent == 0:
295 # We can get here for different reasons, the main
296 # one being 'file' is not a regular mmap(2)-like
297 # file, in which case we'll fall back on using
298 # plain send().
299 raise _GiveupOnSendfile(err)
300 raise err from None
301 else:
302 if sent == 0:
303 break # EOF
304 offset += sent
305 total_sent += sent
306 return total_sent
307 finally:
308 if total_sent > 0 and hasattr(file, 'seek'):
309 file.seek(offset)
310 else:
311 def _sendfile_use_sendfile(self, file, offset=0, count=None):
312 raise _GiveupOnSendfile(
313 "os.sendfile() not available on this platform")
314
315 def _sendfile_use_send(self, file, offset=0, count=None):
316 self._check_sendfile_params(file, offset, count)
317 if self.gettimeout() == 0:
318 raise ValueError("non-blocking sockets are not supported")
319 if offset:
320 file.seek(offset)
321 blocksize = min(count, 8192) if count else 8192
322 total_sent = 0
323 # localize variable access to minimize overhead
324 file_read = file.read
325 sock_send = self.send
326 try:
327 while True:
328 if count:
329 blocksize = min(count - total_sent, blocksize)
330 if blocksize <= 0:
331 break
332 data = memoryview(file_read(blocksize))
333 if not data:
334 break # EOF
335 while True:
336 try:
337 sent = sock_send(data)
338 except BlockingIOError:
339 continue
340 else:
341 total_sent += sent
342 if sent < len(data):
343 data = data[sent:]
344 else:
345 break
346 return total_sent
347 finally:
348 if total_sent > 0 and hasattr(file, 'seek'):
349 file.seek(offset + total_sent)
350
351 def _check_sendfile_params(self, file, offset, count):
352 if 'b' not in getattr(file, 'mode', 'b'):
353 raise ValueError("file should be opened in binary mode")
354 if not self.type & SOCK_STREAM:
355 raise ValueError("only SOCK_STREAM type sockets are supported")
356 if count is not None:
357 if not isinstance(count, int):
358 raise TypeError(
359 "count must be a positive integer (got {!r})".format(count))
360 if count <= 0:
361 raise ValueError(
362 "count must be a positive integer (got {!r})".format(count))
363
364 def sendfile(self, file, offset=0, count=None):
365 """sendfile(file[, offset[, count]]) -> sent
366
367 Send a file until EOF is reached by using high-performance
368 os.sendfile() and return the total number of bytes which
369 were sent.
370 *file* must be a regular file object opened in binary mode.
371 If os.sendfile() is not available (e.g. Windows) or file is
372 not a regular file socket.send() will be used instead.
373 *offset* tells from where to start reading the file.
374 If specified, *count* is the total number of bytes to transmit
375 as opposed to sending the file until EOF is reached.
376 File position is updated on return or also in case of error in
377 which case file.tell() can be used to figure out the number of
378 bytes which were sent.
379 The socket must be of SOCK_STREAM type.
380 Non-blocking sockets are not supported.
381 """
382 try:
383 return self._sendfile_use_sendfile(file, offset, count)
384 except _GiveupOnSendfile:
385 return self._sendfile_use_send(file, offset, count)
386
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000387 def _decref_socketios(self):
388 if self._io_refs > 0:
389 self._io_refs -= 1
390 if self._closed:
391 self.close()
392
Daniel Stutzbach19d6a4f2010-08-31 20:08:07 +0000393 def _real_close(self, _ss=_socket.socket):
Benjamin Peterson49203dc2010-08-31 20:10:55 +0000394 # This function should not reference any globals. See issue #808164.
Daniel Stutzbach19d6a4f2010-08-31 20:08:07 +0000395 _ss.close(self)
Bill Janssen54cc54c2007-12-14 22:08:56 +0000396
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000397 def close(self):
Benjamin Peterson49203dc2010-08-31 20:10:55 +0000398 # This function should not reference any globals. See issue #808164.
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000399 self._closed = True
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000400 if self._io_refs <= 0:
Bill Janssen54cc54c2007-12-14 22:08:56 +0000401 self._real_close()
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000402
Antoine Pitrou70deb3d2012-04-01 01:00:17 +0200403 def detach(self):
404 """detach() -> file descriptor
405
406 Close the socket object without closing the underlying file descriptor.
407 The object cannot be used after this call, but the file descriptor
408 can be reused for other purposes. The file descriptor is returned.
409 """
410 self._closed = True
411 return super().detach()
412
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -0700413 @property
414 def family(self):
415 """Read-only access to the address family for this socket.
416 """
417 return _intenum_converter(super().family, AddressFamily)
418
419 @property
420 def type(self):
421 """Read-only access to the socket type.
422 """
423 return _intenum_converter(super().type, SocketType)
424
Victor Stinnerdaf45552013-08-28 00:53:59 +0200425 if os.name == 'nt':
426 def get_inheritable(self):
427 return os.get_handle_inheritable(self.fileno())
428 def set_inheritable(self, inheritable):
429 os.set_handle_inheritable(self.fileno(), inheritable)
430 else:
431 def get_inheritable(self):
432 return os.get_inheritable(self.fileno())
433 def set_inheritable(self, inheritable):
434 os.set_inheritable(self.fileno(), inheritable)
435 get_inheritable.__doc__ = "Get the inheritable flag of the socket"
436 set_inheritable.__doc__ = "Set the inheritable flag of the socket"
437
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000438def fromfd(fd, family, type, proto=0):
439 """ fromfd(fd, family, type[, proto]) -> socket object
440
441 Create a socket object from a duplicate of the given file
442 descriptor. The remaining arguments are the same as for socket().
443 """
444 nfd = dup(fd)
445 return socket(family, type, proto, nfd)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000446
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +0000447if hasattr(_socket.socket, "share"):
448 def fromshare(info):
449 """ fromshare(info) -> socket object
450
451 Create a socket object from a the bytes object returned by
452 socket.share(pid).
453 """
454 return socket(0, 0, 0, info)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000455
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000456if hasattr(_socket, "socketpair"):
457
458 def socketpair(family=None, type=SOCK_STREAM, proto=0):
459 """socketpair([family[, type[, proto]]]) -> (socket object, socket object)
460
461 Create a pair of socket objects from the sockets returned by the platform
462 socketpair() function.
463 The arguments are the same as for socket() except the default family is
464 AF_UNIX if defined on the platform; otherwise, the default is AF_INET.
465 """
466 if family is None:
467 try:
468 family = AF_UNIX
469 except NameError:
470 family = AF_INET
471 a, b = _socket.socketpair(family, type, proto)
472 a = socket(family, type, proto, a.detach())
473 b = socket(family, type, proto, b.detach())
474 return a, b
475
Charles-François Natali98c745a2014-10-14 21:22:44 +0100476else:
477
478 # Origin: https://gist.github.com/4325783, by Geert Jansen. Public domain.
479 def socketpair(family=AF_INET, type=SOCK_STREAM, proto=0):
480 if family == AF_INET:
481 host = _LOCALHOST
482 elif family == AF_INET6:
483 host = _LOCALHOST_V6
484 else:
485 raise ValueError("Only AF_INET and AF_INET6 socket address families "
486 "are supported")
487 if type != SOCK_STREAM:
488 raise ValueError("Only SOCK_STREAM socket type is supported")
489 if proto != 0:
490 raise ValueError("Only protocol zero is supported")
491
492 # We create a connected TCP socket. Note the trick with
493 # setblocking(False) that prevents us from having to create a thread.
494 lsock = socket(family, type, proto)
495 try:
496 lsock.bind((host, 0))
497 lsock.listen()
498 # On IPv6, ignore flow_info and scope_id
499 addr, port = lsock.getsockname()[:2]
500 csock = socket(family, type, proto)
501 try:
502 csock.setblocking(False)
503 try:
504 csock.connect((addr, port))
505 except (BlockingIOError, InterruptedError):
506 pass
507 csock.setblocking(True)
508 ssock, _ = lsock.accept()
509 except:
510 csock.close()
511 raise
512 finally:
513 lsock.close()
514 return (ssock, csock)
515
516socketpair.__doc__ = """socketpair([family[, type[, proto]]]) -> (socket object, socket object)
517Create a pair of socket objects from the sockets returned by the platform
518socketpair() function.
519The arguments are the same as for socket() except the default family is AF_UNIX
520if defined on the platform; otherwise, the default is AF_INET.
521"""
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000522
Antoine Pitrou98b46702010-09-18 22:59:00 +0000523_blocking_errnos = { EAGAIN, EWOULDBLOCK }
524
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000525class SocketIO(io.RawIOBase):
526
527 """Raw I/O implementation for stream sockets.
528
529 This class supports the makefile() method on sockets. It provides
530 the raw I/O interface on top of a socket object.
531 """
532
Antoine Pitrou872b79d2010-09-15 08:39:25 +0000533 # One might wonder why not let FileIO do the job instead. There are two
534 # main reasons why FileIO is not adapted:
535 # - it wouldn't work under Windows (where you can't used read() and
536 # write() on a socket handle)
537 # - it wouldn't work with socket timeouts (FileIO would ignore the
538 # timeout and consider the socket non-blocking)
539
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000540 # XXX More docs
541
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000542 def __init__(self, sock, mode):
Benjamin Peterson44309e62008-11-22 00:41:45 +0000543 if mode not in ("r", "w", "rw", "rb", "wb", "rwb"):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000544 raise ValueError("invalid mode: %r" % mode)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000545 io.RawIOBase.__init__(self)
546 self._sock = sock
Benjamin Peterson44309e62008-11-22 00:41:45 +0000547 if "b" not in mode:
548 mode += "b"
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000549 self._mode = mode
Guido van Rossum5abbf752007-08-27 17:39:33 +0000550 self._reading = "r" in mode
551 self._writing = "w" in mode
Antoine Pitrou68e5c042011-02-25 23:07:44 +0000552 self._timeout_occurred = False
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000553
554 def readinto(self, b):
Antoine Pitrou5aa0d102010-09-15 09:32:45 +0000555 """Read up to len(b) bytes into the writable buffer *b* and return
556 the number of bytes read. If the socket is non-blocking and no bytes
557 are available, None is returned.
558
559 If *b* is non-empty, a 0 return value indicates that the connection
560 was shutdown at the other end.
561 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000562 self._checkClosed()
563 self._checkReadable()
Antoine Pitrou68e5c042011-02-25 23:07:44 +0000564 if self._timeout_occurred:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200565 raise OSError("cannot read from timed out object")
Gregory P. Smithaafdca82010-01-04 04:50:36 +0000566 while True:
567 try:
568 return self._sock.recv_into(b)
Antoine Pitrou68e5c042011-02-25 23:07:44 +0000569 except timeout:
570 self._timeout_occurred = True
571 raise
Antoine Pitrou24d659d2011-10-23 23:49:42 +0200572 except InterruptedError:
573 continue
Gregory P. Smithaafdca82010-01-04 04:50:36 +0000574 except error as e:
Antoine Pitrou24d659d2011-10-23 23:49:42 +0200575 if e.args[0] in _blocking_errnos:
Antoine Pitrou98b46702010-09-18 22:59:00 +0000576 return None
Gregory P. Smithaafdca82010-01-04 04:50:36 +0000577 raise
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000578
579 def write(self, b):
Antoine Pitrou5aa0d102010-09-15 09:32:45 +0000580 """Write the given bytes or bytearray object *b* to the socket
581 and return the number of bytes written. This can be less than
582 len(b) if not all data could be written. If the socket is
583 non-blocking and no bytes could be written None is returned.
584 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000585 self._checkClosed()
586 self._checkWritable()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000587 try:
588 return self._sock.send(b)
589 except error as e:
590 # XXX what about EINTR?
591 if e.args[0] in _blocking_errnos:
592 return None
593 raise
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000594
595 def readable(self):
Antoine Pitrou5aa0d102010-09-15 09:32:45 +0000596 """True if the SocketIO is open for reading.
597 """
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +0200598 if self.closed:
599 raise ValueError("I/O operation on closed socket.")
600 return self._reading
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000601
602 def writable(self):
Antoine Pitrou5aa0d102010-09-15 09:32:45 +0000603 """True if the SocketIO is open for writing.
604 """
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +0200605 if self.closed:
606 raise ValueError("I/O operation on closed socket.")
607 return self._writing
608
609 def seekable(self):
610 """True if the SocketIO is open for seeking.
611 """
612 if self.closed:
613 raise ValueError("I/O operation on closed socket.")
614 return super().seekable()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000615
616 def fileno(self):
Antoine Pitrou5aa0d102010-09-15 09:32:45 +0000617 """Return the file descriptor of the underlying socket.
618 """
Gregory P. Smithde3369f2009-01-12 04:50:11 +0000619 self._checkClosed()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000620 return self._sock.fileno()
621
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000622 @property
623 def name(self):
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000624 if not self.closed:
625 return self.fileno()
626 else:
627 return -1
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000628
629 @property
630 def mode(self):
631 return self._mode
632
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000633 def close(self):
Antoine Pitrou5aa0d102010-09-15 09:32:45 +0000634 """Close the SocketIO object. This doesn't close the underlying
635 socket, except if all references to it have disappeared.
636 """
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000637 if self.closed:
638 return
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000639 io.RawIOBase.close(self)
Gregory P. Smithde3369f2009-01-12 04:50:11 +0000640 self._sock._decref_socketios()
641 self._sock = None
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000642
Fred Drakea6070f02000-08-16 14:14:32 +0000643
644def getfqdn(name=''):
645 """Get fully qualified domain name from name.
646
647 An empty argument is interpreted as meaning the local host.
648
649 First the hostname returned by gethostbyaddr() is checked, then
650 possibly existing aliases. In case no FQDN is available, hostname
Brett Cannon01668a12005-03-11 00:04:17 +0000651 from gethostname() is returned.
Fred Drakea6070f02000-08-16 14:14:32 +0000652 """
653 name = name.strip()
Peter Schneider-Kamp2d2785a2000-08-16 20:30:21 +0000654 if not name or name == '0.0.0.0':
Fred Drakea6070f02000-08-16 14:14:32 +0000655 name = gethostname()
656 try:
657 hostname, aliases, ipaddrs = gethostbyaddr(name)
658 except error:
659 pass
660 else:
661 aliases.insert(0, hostname)
662 for name in aliases:
663 if '.' in name:
664 break
665 else:
666 name = hostname
667 return name
668
669
Georg Brandlf78e02b2008-06-10 17:40:04 +0000670_GLOBAL_DEFAULT_TIMEOUT = object()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000671
Gregory P. Smithb4066372010-01-03 03:28:29 +0000672def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT,
673 source_address=None):
Georg Brandlf78e02b2008-06-10 17:40:04 +0000674 """Connect to *address* and return the socket object.
675
676 Convenience function. Connect to *address* (a 2-tuple ``(host,
677 port)``) and return the socket object. Passing the optional
678 *timeout* parameter will set the timeout on the socket instance
679 before attempting to connect. If no *timeout* is supplied, the
680 global default timeout setting returned by :func:`getdefaulttimeout`
Gregory P. Smithb4066372010-01-03 03:28:29 +0000681 is used. If *source_address* is set it must be a tuple of (host, port)
682 for the socket to bind as a source address before making the connection.
683 An host of '' or port 0 tells the OS to use the default.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000684 """
685
Guido van Rossumd8faa362007-04-27 19:54:29 +0000686 host, port = address
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +0000687 err = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000688 for res in getaddrinfo(host, port, 0, SOCK_STREAM):
689 af, socktype, proto, canonname, sa = res
690 sock = None
691 try:
692 sock = socket(af, socktype, proto)
Georg Brandlf78e02b2008-06-10 17:40:04 +0000693 if timeout is not _GLOBAL_DEFAULT_TIMEOUT:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000694 sock.settimeout(timeout)
Gregory P. Smithb4066372010-01-03 03:28:29 +0000695 if source_address:
696 sock.bind(source_address)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000697 sock.connect(sa)
698 return sock
699
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +0000700 except error as _:
701 err = _
Guido van Rossumd8faa362007-04-27 19:54:29 +0000702 if sock is not None:
703 sock.close()
704
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +0000705 if err is not None:
706 raise err
707 else:
708 raise error("getaddrinfo returns an empty list")
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -0700709
710def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0):
711 """Resolve host and port into list of address info entries.
712
713 Translate the host/port argument into a sequence of 5-tuples that contain
714 all the necessary arguments for creating a socket connected to that service.
715 host is a domain name, a string representation of an IPv4/v6 address or
716 None. port is a string service name such as 'http', a numeric port number or
717 None. By passing None as the value of host and port, you can pass NULL to
718 the underlying C API.
719
720 The family, type and proto arguments can be optionally specified in order to
721 narrow the list of addresses returned. Passing zero as a value for each of
722 these arguments selects the full range of results.
723 """
724 # We override this function since we want to translate the numeric family
725 # and socket type values to enum constants.
726 addrlist = []
727 for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
728 af, socktype, proto, canonname, sa = res
729 addrlist.append((_intenum_converter(af, AddressFamily),
730 _intenum_converter(socktype, SocketType),
731 proto, canonname, sa))
732 return addrlist