3

スレッドを使用するために編集しているポート スキャナーに問題があります。これは、元のコードの基本です。

for i in range(0, 2000):  

    s = socket(AF_INET, SOCK_STREAM)  
    result = s.connect_ex((TargetIP, i))  

    if(result == 0) :  
        c = "Port %d: OPEN\n" % (i,)  

    s.close()

完了するまでに約 33 分かかります。そこで、スレッド化して、少し速く実行できるようにしようと考えました。これは私の最初のスレッド化プロジェクトなので、それほど極端ではありませんが、次のコードを約 1 時間実行しましたが、例外は発生していませんが、出力はありません。スレッドが間違っているだけですか、それとも何ですか?

import threading
from socket import *
import time

a = 0
b = 0
c = ""
d = ""

def ScanLow():
    global a
    global c

    for i in range(0, 1000):  
        s = socket(AF_INET, SOCK_STREAM)  
        result = s.connect_ex((TargetIP, i))  

        if(result == 0) :  
            c = "Port %d: OPEN\n" % (i,)  

        s.close()  
        a += 1

def ScanHigh():
    global b
    global d

    for i in range(1001, 2000):  
        s = socket(AF_INET, SOCK_STREAM)  
        result = s.connect_ex((TargetIP, i))  

        if(result == 0) :  
            d = "Port %d: OPEN\n" % (i,)  

        s.close()  
        b += 1

Target = raw_input("Enter Host To Scan:")
TargetIP = gethostbyname(Target)

print "Start Scan On Host ", TargetIP
Start = time.time()

threading.Thread(target = ScanLow).start()
threading.Thread(target = ScanHigh).start()

e = a + b

while e < 2000:
    f = raw_input()

End = time.time() - Start
print c
print d
print End

g = raw_input()
4

2 に答える 2

5

これは、コードが失敗している場所です。

threading.Thread(target = ScanLow).start()
threading.Thread(target = ScanHigh).start()

e = a + b

while e < 2000:
   f = raw_input()

スレッドを開始した直後に、値を に設定しますe。ただし、その後は更新eしないため、ループは終了しません。

また、両方のスレッドが終了するまで待つためにこれを行っているようです。このjoin()方法は、これを行うためのより良い方法です。

from threading import Thread
threads = []
threads.append(Thread(target = ScanLow))
threads.append(Thread(target = ScanHigh))
for thread in threads:
  thread.start()
//both threads are running
for thread in threads:
  thread.join()
//both threads have stopped

編集: 質問とは関係ありませんが、役立つコメントです。両方のスキャン機能はまったく同じことをしています。それらを、スキャン範囲を引数として取り、1 つの関数で両方のスレッドを開始する 1 つの関数に置き換えることができます。

from threading import Thread
def Scan(start, stop):
    global a
    global c

    for i in range(start, stop):  
        s = socket(AF_INET, SOCK_STREAM)  
        result = s.connect_ex((TargetIP, i))  

        if(result == 0) :  
            c = "Port %d: OPEN\n" % (i,)  

        s.close()  
        a += 1

threadCount = 2
totalPorts = 2000
threads = []
for start in xrange(0, totalPorts, totalPorts/threadCount):
    threads.append(Thread(target = Scan, args = (start, totalPorts/threadCount)))

for thread in threads:
  thread.start()
//both threads are running
for thread in threads:
  thread.join()
//both threads have stopped

また、スキャンするスレッドとポートの数を簡単に調整できるようになりました。

于 2011-01-09T17:39:57.493 に答える
1

スレッドを監視するための厄介な方法があります。を使用joinすると、スレッドが完了したことが示されます。結果をより速く取得するために、より多くのスレッドをスピンオフしない理由はありません。

import threading
import socket
import time

ports = []
def check_port(ip,port):
    s = socket.socket()
    if s.connect_ex((ip,port)) == 0:
        ports.append(port)
    s.close()

target = raw_input('Target? ')
s = time.time()
threads = []
for port in range(2000):
    t = threading.Thread(target=check_port,args=(target,port))
    t.start()
    threads.append(t)
for t in threads:
    t.join()
print ports
print time.time() - s

出力

[80, 135, 445, 1028]
6.92199993134
于 2011-01-09T18:55:49.823 に答える