Python socket connect()与connect_ex()

时间:2018-01-18 09:50:49

标签: python sockets networking

我想看看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的两倍。如果涉及语法,唯一的区别是connecttry except围绕它并在无法连接时捕获错误,并且connect_ex检查结果为0或错误。这一点都很清楚但我的问题是为什么connect_ex的工作速度比connect快?导致这种行为的原因是什么?

1 个答案:

答案 0 :(得分:0)

socket.connect(地址)-> 在地址处连接到远程套接字。 (地址的格式取决于地址系列-参见上文。)

如果连接被信号中断,则该方法将等待直到连接完成,或者在信号处理程序未引发异常并且套接字正在阻塞或发生超时的情况下,在超时时引发socket.timeout。对于非阻塞套接字,如果连接被信号中断(或信号处理程序引发的异常),则该方法将引发InterruptedError异常。

引发审核事件套接字。使用参数self,address连接。

在版本3.5中进行了更改:现在,该方法将等待直到连接完成,而不是如果连接被信号中断,信号处理程序不会引发异常并且套接字正在阻塞或具有超时(原理请参见PEP 475。

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

引发审核事件套接字。使用参数self,address连接。

参考:https://docs.python.org/3/library/socket.html