我想看一下Python中的这两个函数。我做了一些研究,偶然发现了这样的事情:
Socket.connect_ex(地址) 与connect(address)类似,但返回一个错误指示符,而不是为C级connect()调用返回的错误引发异常(其他问题,如“主机未找到”,仍然会引发异常)。如果操作成功,则错误指示符为0,否则为errno变量的值。例如,这对于支持异步连接非常有用。
我完全明白。我编写了一个简单的端口扫描器来测试效率,得到了有趣的结果:
[*] start scanning on host 127.0.0.1 for ports range(0, 65535) with
method(connect)
[*] method connect finished in 0:00:12.253352
[*] start scanning on host 127.0.0.1 for ports range(0, 65535) with
method(connect_ex)
[*] method connect_ex finished in 0:00:06.839319因此,connect_ex的效率似乎是connect的两倍。如果涉及到语法,唯一的区别是在使用connect时,您使用try except包围它,并在它无法连接时捕获一个错误;使用connect_ex,您将检查结果是否为0或errno。这一切都很清楚,但我的问题是,为什么connect_ex比connect工作得更快?究竟是甚麽原因导致这样的行为呢?
发布于 2020-06-13 18:42:05
socket.connect(address) ->连接到地址的远程套接字。(地址的格式取决于地址家族-见上文。)
如果连接被信号中断,则方法等待连接完成,或者在超时时引发socket.timeout,如果信号处理程序不引发异常,套接字阻塞或超时。对于非阻塞套接字,如果连接被信号(或信号处理程序引发的异常)中断,则该方法将引发InterruptedError异常。
引发具有参数self、address的审核事件socket.connect。
在版本3.5中更改:该方法现在等待连接完成,而不是在连接被信号中断时引发InterruptedError异常,信号处理程序不会引发异常,套接字阻塞或超时(请参阅PEP 475的基本原理)。
socket.connect_ex(address) ->与connect(address)类似,但返回错误指示器而不是为C级connect()调用返回的错误引发异常(其他问题,如“主机未找到”,仍然会引发异常)。如果操作成功,则错误指示符为0,否则为errno变量的值。例如,这对于支持异步连接非常有用。
引发具有参数self、address的审核事件socket.connect。
https://stackoverflow.com/questions/48318266
复制相似问题