Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 3539ef3

Browse files
committed
merge 79422b3684f1 in 3.3 branch (issue 10340)
2 parents cc58031 + 350c94b commit 3539ef3

2 files changed

Lines changed: 25 additions & 8 deletions

File tree

Lib/asyncore.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ class dispatcher:
217217
debug = False
218218
connected = False
219219
accepting = False
220+
connecting = False
220221
closing = False
221222
addr = None
222223
ignore_log_types = frozenset(['warning'])
@@ -240,7 +241,7 @@ def __init__(self, sock=None, map=None):
240241
try:
241242
self.addr = sock.getpeername()
242243
except socket.error as err:
243-
if err.args[0] == ENOTCONN:
244+
if err.args[0] in (ENOTCONN, EINVAL):
244245
# To handle the case where we got an unconnected
245246
# socket.
246247
self.connected = False
@@ -334,6 +335,7 @@ def bind(self, addr):
334335

335336
def connect(self, address):
336337
self.connected = False
338+
self.connecting = True
337339
err = self.socket.connect_ex(address)
338340
if err in (EINPROGRESS, EALREADY, EWOULDBLOCK) \
339341
or err == EINVAL and os.name in ('nt', 'ce'):
@@ -393,6 +395,7 @@ def recv(self, buffer_size):
393395
def close(self):
394396
self.connected = False
395397
self.accepting = False
398+
self.connecting = False
396399
self.del_channel()
397400
try:
398401
self.socket.close()
@@ -431,7 +434,8 @@ def handle_read_event(self):
431434
# sockets that are connected
432435
self.handle_accept()
433436
elif not self.connected:
434-
self.handle_connect_event()
437+
if self.connecting:
438+
self.handle_connect_event()
435439
self.handle_read()
436440
else:
437441
self.handle_read()
@@ -442,6 +446,7 @@ def handle_connect_event(self):
442446
raise socket.error(err, _strerror(err))
443447
self.handle_connect()
444448
self.connected = True
449+
self.connecting = False
445450

446451
def handle_write_event(self):
447452
if self.accepting:
@@ -450,12 +455,8 @@ def handle_write_event(self):
450455
return
451456

452457
if not self.connected:
453-
#check for errors
454-
err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR)
455-
if err != 0:
456-
raise socket.error(err, _strerror(err))
457-
458-
self.handle_connect_event()
458+
if self.connecting:
459+
self.handle_connect_event()
459460
self.handle_write()
460461

461462
def handle_expt_event(self):

Lib/test/test_asyncore.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import time
88
import warnings
99
import errno
10+
import struct
1011

1112
from test import support
1213
from test.support import TESTFN, run_unittest, unlink
@@ -778,6 +779,21 @@ def test_set_reuse_addr(self):
778779
finally:
779780
sock.close()
780781

782+
@unittest.skipUnless(threading, 'Threading required for this test.')
783+
@support.reap_threads
784+
def test_quick_connect(self):
785+
# see: http://bugs.python.org/issue10340
786+
server = TCPServer()
787+
t = threading.Thread(target=lambda: asyncore.loop(timeout=0.1, count=500))
788+
t.start()
789+
790+
for x in range(20):
791+
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
792+
s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER,
793+
struct.pack('ii', 1, 0))
794+
s.connect(server.address)
795+
s.close()
796+
781797

782798
class TestAPI_UseIPv4Sockets(BaseTestAPI):
783799
family = socket.AF_INET

0 commit comments

Comments
 (0)