我正在构建一个端口扫描程序((与问题无关,只是解释背景((,我知道主机的IP,但不知道打开了哪些端口。因此,扫描。
它处于开发的早期阶段,所以错误处理很糟糕,但还不够糟糕,无法解释为什么 Python 会这样做。
它尝试连接到,比如说,123.456.7.8, 1
.显然,打开端口是一个荒谬的端口,因此它会抛出错误。错误是No Route to Host
之类的,对吧?错!而是Operation Timed Out!
.
好的,让我们增加超时,以防我的计算不正确。
..........所做的只是冲洗并重复!
大约 20 分钟后,超时为 20 秒,并且仍然超时。真?为什么python会引发timed out
错误,而不是No route to host!
或类似的错误?
我需要区分超时和连接失败,因为延迟和无处之间是有区别的。这阻止了我这样做,创造了一个匆忙等待的无限循环。
我该怎么办?我该去哪里?
Python socket
模块是围绕平台套接字 API 的薄包装器。这个问题与 Python 无关。
没有必要得到No Route to Host
错误。此外,防火墙通常只是丢弃收到的数据包(对于过滤的端口(,这些数据包可能会在代码中表现为超时错误。请参阅丢弃与拒绝(忽略结论,但阅读正在发生的事情的解释(。
要解决此问题,请建立多个并发连接并设置固定超时,或者使用原始套接字并自行发送数据包(您可以使用 scapy
来调查行为(。