Python - 带套接字的多线程提供随机结果

时间:2016-09-07 06:12:18

标签: python multithreading sockets connection multiprocessing

我现在对我的问题感到很困惑。我想在主机(或子网)列表上发现一个开放端口。

首先让我们展示我到目前为止所做的事情。

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)会随机(在我看来......)返回01

我也知道:

  • 始终只扫描8.8.8.8次打印1
  • 仅使用 1 线程/24始终打印1
  • 使用 256 个帖子/24随机打印01
  • 更改超时无济于事

所以它似乎与线程选项有关,导致我的计算机滞后。但请注意,我的CPU使用率<10%,网络使用率<50%!

但还有另一件事我不明白.. 如果print str(this.count)返回0我通常认为这是因为线程彼此冲突而套接字没有得到连接..但这不是真的,因为如果{{1} }等于this.count0设置为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

任何有套接字线程经验的人都可以向我解释一下情况,或者给我一个如何防止这种情况的答案?

解决:

..看看答案..

1 个答案:

答案 0 :(得分:0)

第一个错误是:

  

但是请注意我的CPU使用率<10%而且   网络使用率<50%!

实际上,这是400%的网络使用率。我期望比特而不是字节 非常尴尬..

第二个错误是:

  

我们确信端口肯定是开放的

谷歌确实在短时间内尝试了〜5次以后阻止该端口。他们在几秒钟或几分钟后释放限制。