使用 python 套接字检查本地端口太快

使用 python 套接字检查本地端口太快

该代码示例在《CPython Internals》一书中给出。

from queue import Queue
import socket
import time
timeout = 1.0

def check_port(host: str, port: int, results: Queue):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(timeout)
    result = sock.connect_ex((host, port))
    if result == 0:
        results.put(port)
    sock.close()

if __name__ == '__main__':
    start = time.time()
    host = "localhost"
    results = Queue()
    for port in range(80, 100):
        check_port(host, port, results)
    while not results.empty():
        print("Port {0} is open".format(results.get()))
    print("Completed scan in {0} seconds".format(time.time() - start))

如果host == 'localhost',那么这个脚本运行得非常快(所有端口(从 1 到 65535)检查大约 1.5 秒!),而且,超时的持续时间不起任何作用。

如果我设置主机“8.8.8.8”或其他外部主机,则脚本执行时间看起来是正确的。例如,在timeout == 18.8.8.8 上检查从 440 到 444 的端口大约需要 4 秒。

为什么检查本地端口的可用性这么快? (如果重要的话我会使用Ubuntu)

我知道这没有实际需要。我只是想知道为什么检查本地端口时超时值不会影响脚本执行时间。我想这个问题更多的是关于操作系统而不是编程,所以我在这里。

答案1

如果是本地主机,连接尝试会立即被拒绝,因此不会达到超时。对于远程主机,它可能只是丢弃数据包而不是拒绝(取决于防火墙和主机配置),因此它将遇到超时。

相关内容