2014-07-16 45 views
1

我有一个客户端需要反复轮询以查看预期的服务器是否存在,并优雅地处理它可能不会延长的事实时间。套接字OSError [WinError 10022]使连接()尝试过快

看哪以下测试脚本:

import socket, time 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.settimeout(0.1) 

delay = 2 
connected = False 

while not connected: 
    try: 
     s.connect(("localhost", 50000)) # I'm running my test server locally 
     connected = True 

    except socket.timeout: 
     print("Timed out. Waiting " + str(round(delay, 1)) + "s before next attempt.") 
     time.sleep(delay) 
     delay -= 0.1 

结果:

Timed out. Waiting 2s before next attempt. 
Timed out. Waiting 1.9s before next attempt. 
Timed out. Waiting 1.8s before next attempt. 
Timed out. Waiting 1.7s before next attempt. 
Timed out. Waiting 1.6s before next attempt. 
Timed out. Waiting 1.5s before next attempt. 
Timed out. Waiting 1.4s before next attempt. 
Timed out. Waiting 1.3s before next attempt. 
Timed out. Waiting 1.2s before next attempt. 
Timed out. Waiting 1.1s before next attempt. 
Timed out. Waiting 1.0s before next attempt. 
Timed out. Waiting 0.9s before next attempt. 
Traceback (most recent call last): 
    File "C:/Users/Lewis/Desktop/sockettest.py", line 11, in <module> 
    s.connect(("localhost", 50000)) 
OSError: [WinError 10022] An invalid argument was supplied 

看来,如果我不把我的connect()的尝试之间的约0.9S的延迟,我得到这个异常。

这是怎么回事?

+0

我想我已经看到过这样的事情。它实际上是MS Windows中的一个设置,可以防止短时间内建立多个连接。我不记得理由,但它必须保护他人免受计算机上的不当行为。你可以通过注册表来配置它。 –

+0

有趣,这是有道理的。我不打算通过我的程序来触摸这个注册表设置,我只需设置延迟即可。但是,我想知道是否可以找到一些有关延迟可能的文档以及其他任何考虑事项。我不喜欢只是盲目地设置一个延迟,并希望它的工作:) – Lewis

回答

0

您对每个连接“尝试”都使用一个套接字。套接字只能用于一个连接。你实际上只在这里做一次连接尝试。当它最终超时时,套接字就会处于不允许再拨打connect的状态。

为每个想要尝试的新连接尝试创建一个新套接字。

+0

甜,我确实可以迅速启动connect()尝试,如果我每次创建一个新的套接字。我没有关注我的代码实际上只是进行一次连接尝试,也不知道为什么如果每次使用相同的套接字时都需要这种看似任意的延迟。 – Lewis

+0

第二次在套接字上调用'connect'不会尝试第二次连接。这就是TCP套接字的工作原理。 –

+0

我修改了我的客户端,因此它尝试连接一次,然后等待10秒,然后尝试再次连接,都在同一个套接字上。在十几岁的等待期间,我启动了主持人。客户端第二次成功连接。我仍然不遵循它不尝试第二次连接的方式。它确实看起来像。 – Lewis

相关问题