blob: 62eb82dcd1889a410d4ddefc6d1b04b2ce06fd4f [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)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000024socket.getdefaulttimeout() -- get the default timeout value
25socket.setdefaulttimeout() -- set the default timeout value
Guido van Rossumd8faa362007-04-27 19:54:29 +000026create_connection() -- connects to an address, with an optional timeout
Fred Drakea6070f02000-08-16 14:14:32 +000027
28 [*] not available on all platforms!
29
30Special objects:
31
32SocketType -- type object for socket objects
33error -- exception raised for I/O errors
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000034has_ipv6 -- boolean value indicating if IPv6 is supported
Fred Drakea6070f02000-08-16 14:14:32 +000035
36Integer constants:
37
38AF_INET, AF_UNIX -- socket domains (first argument to socket() call)
39SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)
40
41Many other constants may be defined; these may be used in calls to
42the setsockopt() and getsockopt() methods.
43"""
44
Tim Peters18e67782002-02-17 04:25:24 +000045import _socket
Fred Drakea6070f02000-08-16 14:14:32 +000046from _socket import *
Tim Peters18e67782002-02-17 04:25:24 +000047
Guido van Rossum7d0a8262007-05-21 23:13:11 +000048import os, sys, io
Fred Drakea6070f02000-08-16 14:14:32 +000049
Fred Drake70d566b2003-04-29 19:50:25 +000050try:
51 from errno import EBADF
52except ImportError:
53 EBADF = 9
54
Skip Montanaro0de65802001-02-15 22:15:14 +000055__all__ = ["getfqdn"]
Skip Montanaro0de65802001-02-15 22:15:14 +000056__all__.extend(os._get_exports_list(_socket))
Thomas Wouters47b49bf2007-08-30 22:15:33 +000057
58
59_realsocket = socket
Skip Montanaro0de65802001-02-15 22:15:14 +000060
Fred Drakea6070f02000-08-16 14:14:32 +000061# WSA error codes
62if sys.platform.lower().startswith("win"):
63 errorTab = {}
64 errorTab[10004] = "The operation was interrupted."
65 errorTab[10009] = "A bad file handle was passed."
66 errorTab[10013] = "Permission denied."
67 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
68 errorTab[10022] = "An invalid operation was attempted."
69 errorTab[10035] = "The socket operation would block"
70 errorTab[10036] = "A blocking operation is already in progress."
71 errorTab[10048] = "The network address is in use."
72 errorTab[10054] = "The connection has been reset."
73 errorTab[10058] = "The network has been shut down."
74 errorTab[10060] = "The operation timed out."
75 errorTab[10061] = "Connection refused."
76 errorTab[10063] = "The name is too long."
77 errorTab[10064] = "The host is down."
78 errorTab[10065] = "The host is unreachable."
Skip Montanaro64de1a42001-03-18 19:53:21 +000079 __all__.append("errorTab")
Guido van Rossumde7cade2002-08-08 15:25:28 +000080
Fred Drakea6070f02000-08-16 14:14:32 +000081
Guido van Rossum7d0a8262007-05-21 23:13:11 +000082class socket(_socket.socket):
83
84 """A subclass of _socket.socket adding the makefile() method."""
85
Guido van Rossum86bc33c2007-11-14 22:32:02 +000086 __slots__ = ["__weakref__", "_io_refs", "_closed"]
Guido van Rossum7d0a8262007-05-21 23:13:11 +000087
Jeremy Hylton5accbdb2007-08-03 20:40:09 +000088 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None):
Guido van Rossum39eb8fa2007-11-16 01:24:05 +000089 _socket.socket.__init__(self, family, type, proto, fileno)
Guido van Rossum86bc33c2007-11-14 22:32:02 +000090 self._io_refs = 0
91 self._closed = False
Jeremy Hylton5accbdb2007-08-03 20:40:09 +000092
Guido van Rossum7d0a8262007-05-21 23:13:11 +000093 def __repr__(self):
94 """Wrap __repr__() to reveal the real class name."""
95 s = _socket.socket.__repr__(self)
96 if s.startswith("<socket object"):
Guido van Rossum86bc33c2007-11-14 22:32:02 +000097 s = "<%s.%s%s%s" % (self.__class__.__module__,
98 self.__class__.__name__,
99 (self._closed and " [closed] ") or "",
100 s[7:])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000101 return s
102
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000103 def dup(self):
104 """dup() -> socket object
105
106 Return a new socket object connected to the same system resource.
107 """
108 fd = dup(self.fileno())
109 sock = self.__class__(self.family, self.type, self.proto, fileno=fd)
110 sock.settimeout(self.gettimeout())
111 return sock
112
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000113 def accept(self):
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000114 """accept() -> (socket object, address info)
115
116 Wait for an incoming connection. Return a new socket
117 representing the connection, and the address of the client.
118 For IP sockets, the address info is a pair (hostaddr, port).
119 """
120 fd, addr = self._accept()
121 return socket(self.family, self.type, self.proto, fileno=fd), addr
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000122
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000123 def makefile(self, mode="r", buffering=None, *,
124 encoding=None, newline=None):
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000125 """makefile(...) -> an I/O stream connected to the socket
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000126
127 The arguments are as for io.open() after the filename,
128 except the only mode characters supported are 'r', 'w' and 'b'.
129 The semantics are similar too. (XXX refactor to share code?)
130 """
131 for c in mode:
132 if c not in {"r", "w", "b"}:
133 raise ValueError("invalid mode %r (only r, w, b allowed)")
134 writing = "w" in mode
135 reading = "r" in mode or not writing
136 assert reading or writing
137 binary = "b" in mode
138 rawmode = ""
139 if reading:
140 rawmode += "r"
141 if writing:
142 rawmode += "w"
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000143 raw = SocketIO(self, rawmode)
144 self._io_refs += 1
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000145 if buffering is None:
146 buffering = -1
147 if buffering < 0:
148 buffering = io.DEFAULT_BUFFER_SIZE
149 if buffering == 0:
150 if not binary:
151 raise ValueError("unbuffered streams must be binary")
152 raw.name = self.fileno()
153 raw.mode = mode
154 return raw
155 if reading and writing:
156 buffer = io.BufferedRWPair(raw, raw, buffering)
157 elif reading:
158 buffer = io.BufferedReader(raw, buffering)
159 else:
160 assert writing
161 buffer = io.BufferedWriter(raw, buffering)
162 if binary:
163 buffer.name = self.fileno()
164 buffer.mode = mode
165 return buffer
166 text = io.TextIOWrapper(buffer, encoding, newline)
167 text.name = self.fileno()
Guido van Rossum93adc5d2007-07-17 20:41:19 +0000168 text.mode = mode
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000169 return text
170
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000171 def _decref_socketios(self):
172 if self._io_refs > 0:
173 self._io_refs -= 1
174 if self._closed:
175 self.close()
176
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000177 def close(self):
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000178 self._closed = True
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000179 if self._io_refs <= 0:
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000180 _socket.socket.close(self)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000181
182
183def fromfd(fd, family, type, proto=0):
184 """ fromfd(fd, family, type[, proto]) -> socket object
185
186 Create a socket object from a duplicate of the given file
187 descriptor. The remaining arguments are the same as for socket().
188 """
189 nfd = dup(fd)
190 return socket(family, type, proto, nfd)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000191
192
193class SocketIO(io.RawIOBase):
194
195 """Raw I/O implementation for stream sockets.
196
197 This class supports the makefile() method on sockets. It provides
198 the raw I/O interface on top of a socket object.
199 """
200
201 # XXX More docs
202
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000203 def __init__(self, sock, mode):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000204 if mode not in ("r", "w", "rw"):
205 raise ValueError("invalid mode: %r" % mode)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000206 io.RawIOBase.__init__(self)
207 self._sock = sock
208 self._mode = mode
Guido van Rossum5abbf752007-08-27 17:39:33 +0000209 self._reading = "r" in mode
210 self._writing = "w" in mode
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000211
212 def readinto(self, b):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000213 self._checkClosed()
214 self._checkReadable()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000215 return self._sock.recv_into(b)
216
217 def write(self, b):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000218 self._checkClosed()
219 self._checkWritable()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000220 return self._sock.send(b)
221
222 def readable(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000223 return self._reading and not self.closed
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000224
225 def writable(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000226 return self._writing and not self.closed
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000227
228 def fileno(self):
229 return self._sock.fileno()
230
231 def close(self):
232 if self.closed:
233 return
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000234 io.RawIOBase.close(self)
235
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000236 def __del__(self):
237 self._sock._decref_socketios()
238
Fred Drakea6070f02000-08-16 14:14:32 +0000239
240def getfqdn(name=''):
241 """Get fully qualified domain name from name.
242
243 An empty argument is interpreted as meaning the local host.
244
245 First the hostname returned by gethostbyaddr() is checked, then
246 possibly existing aliases. In case no FQDN is available, hostname
Brett Cannon01668a12005-03-11 00:04:17 +0000247 from gethostname() is returned.
Fred Drakea6070f02000-08-16 14:14:32 +0000248 """
249 name = name.strip()
Peter Schneider-Kamp2d2785a2000-08-16 20:30:21 +0000250 if not name or name == '0.0.0.0':
Fred Drakea6070f02000-08-16 14:14:32 +0000251 name = gethostname()
252 try:
253 hostname, aliases, ipaddrs = gethostbyaddr(name)
254 except error:
255 pass
256 else:
257 aliases.insert(0, hostname)
258 for name in aliases:
259 if '.' in name:
260 break
261 else:
262 name = hostname
263 return name
264
265
Guido van Rossumd8faa362007-04-27 19:54:29 +0000266def create_connection(address, timeout=None):
267 """Connect to address (host, port) with an optional timeout.
268
269 Provides access to socketobject timeout for higher-level
270 protocols. Passing a timeout will set the timeout on the
271 socket instance (if not present, or passed as None, the
272 default global timeout setting will be used).
273 """
274
275 msg = "getaddrinfo returns an empty list"
276 host, port = address
277 for res in getaddrinfo(host, port, 0, SOCK_STREAM):
278 af, socktype, proto, canonname, sa = res
279 sock = None
280 try:
281 sock = socket(af, socktype, proto)
282 if timeout is not None:
283 sock.settimeout(timeout)
284 sock.connect(sa)
285 return sock
286
287 except error as err:
288 msg = err
289 if sock is not None:
290 sock.close()
291
292 raise error(msg)