Python socket connect()和connect_ex()有什么区别?

16

我想查看Python中的这两个函数。我做了一些研究,发现了这样的东西:

socket.connect_ex(address)

类似于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 效率高一倍。就语法而言,唯一的区别是你要用 try except 包围 connect ,并在连接失败时捕获错误;而对于 connect_ex ,你需要检查结果是否为 0 或 errno。这点很清楚,但我的问题是,为什么 connect_exconnect 运行得更快呢?有什么原因导致这种行为?


4
你已经得出了答案,就是try-except块。扫描65535个端口可能会引发大约65500个异常! - t.m.adam
好的,我理解是由于创建了许多异常对象而不是整数,导致了这个问题。谢谢! - Charlie B
1个回答

5

socket.connect(address) -> 连接到位于address的远程socket(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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接