2016-09-07 10 views
1

私は今私の問題について本当に混乱しています。私は、ホスト(またはサブネット)のリストを介して開いているポートを発見したい。Python - ソケットを使ったマルチスレッドではランダムな結果が得られます

だから、最初のスクリプトがエラーなしで正常に動作します

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が返されます。

私は何も知っている:/24プリントの

  • スキャンのみ8.8.8.8版画常に1
  • のみを使用しスレッド常に1
  • 使用/24版画ランダム01 256件のスレッド
  • tiを変更するmeoutは助けません

私のコンピュータの遅れを引き起こすスレッディングオプションと関係があるようです。しかし、私のCPU使用率は< 10%で、ネットワーク使用量は< 50%です!

しかし、私は、通常のスレッドが互いに競合していると、ソケットが接続を取得していないので、それがあると思うだろう 0戻りprint str(this.count)場合、私は..理解していない別の事もあります..しかし、そのthis.count0の場合、は18.8.8.8)に設定されているため、真ではありません。つまり、ポートは閉鎖されていますが、それは私のスクリプトのバグでもなければなりません。サーバーがポートであることを応答するため0

  • 出力は次のとおりです。私はさらに私たちが知っている...それは遅れがないGoogleの。これは、サーバーの遅れによって引き起こされていること

    を考えることはできません

  • を閉鎖し、我々はポートがだから私はまた、私は同時にif sock.connect_ex((str(ip), this.port)) == 0:を実行する多くのスレッドを持っている場合、多分ホスト8.8.8.8が間違った答え値に見えると考える間違い

開いていることを確認しています。多分それは苦労して、8.8.8.7という応答を見るでしょう。あなたが私の言いたいことを知っていればいいと思う。

** max_socket_connectionsは

誰がソケットスレッドで経験し、私の状況を説明したり、私にこれを防ぐためにどのような答えを与えることができ、私のLinuxディストリビューション上で512に設定されていますか?

解決:

...その答えを見て..

答えて

0

最初の間違いでした:

しかし、私のCPUの使用率が< 10%と であることに注意してくださいネットワーク使用量は< 50%です!

実際には400%のネットワーク使用率でした。私はバイトの代わりにビットを期待していました。
非常embrassing ..

そして第二のミスました:

、我々はポートが

Googleが実際に中〜5回の試行後にポートをブロックしない確かに開いていることを確認しています短期間。彼らは数秒または数分後に制限を解除します。

関連する問題