Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 有没有办法缩短connect_ex()';暂停?_Windows_Python 2.7_Sockets - Fatal编程技术网

Windows 有没有办法缩短connect_ex()';暂停?

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((主机、端口

我正在尝试解决网络连接问题,试图了解为什么一些用户可以在开机时看到一个盒子,而其他用户可能需要近20秒才能看到它。这在我们当地的节目中造成了一些致命的问题

为此,我运行了一个简单的最小可验证python脚本,试图找出问题所在:

导入套接字
导入时间
输入错误号
主机='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。因此,超时是在阻塞上,而不是在连接操作本身上。那就可以解释了,谢谢!