mirror of
https://github.com/python/cpython.git
synced 2025-10-09 16:34:44 +00:00
Issue #7995: When calling accept() on a socket with a timeout, the returned
socket is now always non-blocking, regardless of the operating system.
This commit is contained in:
parent
7d967712b8
commit
600232b562
3 changed files with 27 additions and 1 deletions
|
@ -130,7 +130,13 @@ class socket(_socket.socket):
|
||||||
For IP sockets, the address info is a pair (hostaddr, port).
|
For IP sockets, the address info is a pair (hostaddr, port).
|
||||||
"""
|
"""
|
||||||
fd, addr = self._accept()
|
fd, addr = self._accept()
|
||||||
return socket(self.family, self.type, self.proto, fileno=fd), addr
|
sock = socket(self.family, self.type, self.proto, fileno=fd)
|
||||||
|
# Issue #7995: if no default timeout is set and the listening
|
||||||
|
# socket had a (non-zero) timeout, force the new socket in blocking
|
||||||
|
# mode to override platform-specific socket flags inheritance.
|
||||||
|
if getdefaulttimeout() is None and self.gettimeout():
|
||||||
|
sock.setblocking(True)
|
||||||
|
return sock, addr
|
||||||
|
|
||||||
def makefile(self, mode="r", buffering=None, *,
|
def makefile(self, mode="r", buffering=None, *,
|
||||||
encoding=None, errors=None, newline=None):
|
encoding=None, errors=None, newline=None):
|
||||||
|
|
|
@ -982,6 +982,23 @@ class NonBlockingTCPTests(ThreadedTCPSocketTest):
|
||||||
def _testInitNonBlocking(self):
|
def _testInitNonBlocking(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def testInheritFlags(self):
|
||||||
|
# Issue #7995: when calling accept() on a listening socket with a
|
||||||
|
# timeout, the resulting socket should not be non-blocking.
|
||||||
|
self.serv.settimeout(10)
|
||||||
|
try:
|
||||||
|
conn, addr = self.serv.accept()
|
||||||
|
message = conn.recv(len(MSG))
|
||||||
|
finally:
|
||||||
|
conn.close()
|
||||||
|
self.serv.settimeout(None)
|
||||||
|
|
||||||
|
def _testInheritFlags(self):
|
||||||
|
time.sleep(0.1)
|
||||||
|
self.cli.connect((HOST, self.port))
|
||||||
|
time.sleep(0.5)
|
||||||
|
self.cli.send(MSG)
|
||||||
|
|
||||||
def testAccept(self):
|
def testAccept(self):
|
||||||
# Testing non-blocking accept
|
# Testing non-blocking accept
|
||||||
self.serv.setblocking(0)
|
self.serv.setblocking(0)
|
||||||
|
|
|
@ -30,6 +30,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #7995: When calling accept() on a socket with a timeout, the returned
|
||||||
|
socket is now always non-blocking, regardless of the operating system.
|
||||||
|
|
||||||
- Issue #10756: atexit normalizes the exception before displaying it. Patch by
|
- Issue #10756: atexit normalizes the exception before displaying it. Patch by
|
||||||
Andreas Stührk.
|
Andreas Stührk.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue