Windows 有没有办法缩短connect_ex()';暂停?
我正在尝试解决网络连接问题,试图了解为什么一些用户可以在开机时看到一个盒子,而其他用户可能需要近20秒才能看到它。这在我们当地的节目中造成了一些致命的问题 为此,我运行了一个简单的最小可验证python脚本,试图找出问题所在:Windows 有没有办法缩短connect_ex()';暂停?,windows,python-2.7,sockets,Windows,Python 2.7,Sockets,我正在尝试解决网络连接问题,试图了解为什么一些用户可以在开机时看到一个盒子,而其他用户可能需要近20秒才能看到它。这在我们当地的节目中造成了一些致命的问题 为此,我运行了一个简单的最小可验证python脚本,试图找出问题所在: 导入套接字 导入时间 输入错误号 主机='192.168.1.1' 端口=12345 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s、 设置超时(1) 虽然(正确): err=s.connect_ex((主机、端口
导入套接字
导入时间
输入错误号
主机='192.168.1.1'
端口=12345
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s、 设置超时(1)
虽然(正确):
err=s.connect_ex((主机、端口))
如果err==0:
打印(“连接”)
其他:
打印(“无连接:{0}”。格式(errno.errorcode[err]))
时间。睡眠(2)
当我运行这段代码时,我看到一个一致的模式:EAGAIN,后跟10个EALREADY实例。当它连接时,“已连接”将替换循环的EAGAIN位
我认为将超时设置为1秒并等待2秒应该可以让我在后台更快地中止connect调用,但似乎没有任何效果。是否有一个TCP选项可以设置,或者Windows设置可以调整,以确保在轮询远程框的连接时不会出现这些令人尴尬的20秒阻塞?通过在套接字上设置超时,
socket.connect_ex()
成为一个非阻塞操作。这就是为什么在循环中反复调用connect_ex()
时会出现EAGAIN
和EALREADY
错误的原因-EAGAIN
在第一次调用时表示连接无法立即完成,并且正在后台进行,然后,后续调用的EALREADY
表示现有连接仍在进行中,尚未完成
您的循环只需运行,直到连接最终以成功或失败结束,无论需要多长时间。您正在设置的套接字超时不符合该逻辑
要执行您要求的操作,请在连接循环的同时运行您自己的计时器,如果计时器在socket之前过期,请关闭socket。connect_ex()
返回其最终结果
或者,完全摆脱循环
调用socket.connect_ex()
一次,如果返回EAGAIN
则使用等待连接完成。它有一个timeout
参数。如果挂起的连接尝试成功连接到服务器,TCP套接字将进入可写状态。如果select()
超时或报告错误,请关闭套接字
或者,尝试使用
socket.create_connection()
,它还有一个timeout
参数。Oh。因此,超时是在阻塞上,而不是在连接操作本身上。那就可以解释了,谢谢!