我现在对我的问题感到很困惑。我想在主机(或子网)列表上发现一个开放端口。
首先让我们展示我到目前为止所做的事情。
from multiprocessing.dummy import Pool as ThreadPool
from netaddr import IPNetwork as getAddrList
import socket, sys
this = sys.modules[__name__]
def threading(ip):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.settimeout(this.timeout)
failCode = 0
try:
if sock.connect_ex((str(ip), this.port)) == 0:
#port open
this.count += 1
else:
#port closed/filtered
failCode = 1
pass
except Exception:
#host unreachable
failCode = 2
pass
finally:
sock.close()
#set thread num
threads = 64
#set socket timeout
this.timeout = 1
#set ip list
ipList = getAddrList('8.8.8.0/24')
#set port
this.port = 53
#set count
this.count = 0
#threading
Pool = ThreadPool(threads)
Pool.map_async(threading, ipList).get(9999999)
Pool.close()
Pool.join()
#result
print str(this.count)
脚本运行正常,没有任何错误。但我正在努力解决它打印出来的问题..
因此,如果我想扫描例如子网8.8.8.0/24
并发现端口53
。我知道唯一一个有开放式DNS端口的服务器是8.8.8.8
(google-dns)。
但是当我多次运行我的脚本时,print str(this.count)
会随机(在我看来......)返回0
或1
。
我也知道:
8.8.8.8
次打印1
/24
始终打印1
/24
随机打印0
和1
所以它似乎与线程选项有关,导致我的计算机滞后。但请注意,我的CPU使用率<10%,网络使用率<50%!
但还有另一件事我不明白..
如果print str(this.count)
返回0
我通常认为这是因为线程彼此冲突而套接字没有得到连接..但这不是真的,因为如果{{1} }等于this.count
,0
设置为failCode
(在1
上)!这意味着端口已关闭..但这也必须是我的脚本的错误。我不能认为这是由服务器的延迟引起的..它的谷歌没有滞后..
另外我们知道:
8.8.8.8
的输出是因为服务器响应端口已关闭所以我也想到如果我有很多线程同时运行0
,那么主机if sock.connect_ex((str(ip), this.port)) == 0:
可能看错了答案值。也许它会挣扎并查看8.8.8.8
的回应。 ..希望你知道我的意思。
**我的linux发行版上的max_socket_connections设置为512
任何有套接字线程经验的人都可以向我解释一下情况,或者给我一个如何防止这种情况的答案?
解决:
..看看答案..
答案 0 :(得分:0)
第一个错误是:
但是请注意我的CPU使用率<10%而且 网络使用率<50%!
实际上,这是400%的网络使用率。我期望比特而不是字节 非常尴尬..
第二个错误是:
我们确信端口肯定是开放的
谷歌确实在短时间内尝试了〜5次以后阻止该端口。他们在几秒钟或几分钟后释放限制。