Python 套接字 connect() 与 connect_ex()

Cha*_*e B 7 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
Run Code Online (Sandbox Code Playgroud)

因此,connect_ex似乎效率是connect. 如果涉及到语法,唯一的区别是当它无法连接时,connect您将其包围try except并捕获错误,并connect_ex检查结果是否为 0 或 errno。一切都清楚了,但我的问题是为什么connect_exconnect? 到底是什么原因导致了这种行为?

Ayu*_*aZz 5

socket.connect(address) ->\n连接到地址处的远程套接字。(地址的格式取决于地址族 \xe2\x80\x94,请参见上文。)

\n\n

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

\n\n

使用参数 self、address 引发审核事件 socket.connect。

\n\n

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

\n\n

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

\n\n

使用参数 self、address 引发审核事件 socket.connect。

\n\n

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

\n