首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >()与connect_ex()

()与connect_ex()
EN

Stack Overflow用户
提问于 2018-01-18 09:50:49
回答 1查看 20.7K关注 0票数 14

我想看一下Python中的这两个函数。我做了一些研究,偶然发现了这样的事情:

Socket.connect_ex(地址) 与connect(address)类似,但返回一个错误指示符,而不是为C级connect()调用返回的错误引发异常(其他问题,如“主机未找到”,仍然会引发异常)。如果操作成功,则错误指示符为0,否则为errno变量的值。例如,这对于支持异步连接非常有用。

我完全明白。我编写了一个简单的端口扫描器来测试效率,得到了有趣的结果:

代码语言:javascript
复制
[*] 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_exconnect工作得更快?究竟是甚麽原因导致这样的行为呢?

EN

回答 1

Stack Overflow用户

发布于 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://docs.python.org/3/library/socket.html

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48318266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档