欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

實例探究Python以并發(fā)方式編寫高性能端口掃描器的方法

 更新時間:2016年06月14日 16:27:57   作者:mattkang  
端口掃描器就是向一批端口上發(fā)送請求來檢測端口是否打開的程序,這里我們以實例探究Python以并發(fā)方式編寫高性能端口掃描器的方法

關于端口掃描器
端口掃描工具(Port Scanner)指用于探測服務器或主機開放端口情況的工具。常被計算機管理員用于確認安全策略,同時被攻擊者用于識別目標主機上的可運作的網絡服務。

端口掃描定義是客戶端向一定范圍的服務器端口發(fā)送對應請求,以此確認可使用的端口。雖然其本身并不是惡意的網絡活動,但也是網絡攻擊者探測目標主機服務,以利用該服務的已知漏洞的重要手段。端口掃描的主要用途仍然只是確認遠程機器某個服務的可用性。

掃描多個主機以獲取特定的某個端口被稱為端口清掃(Portsweep),以此獲取特定的服務。例如,基于SQL服務的計算機蠕蟲就會清掃大量主機的同一端口以在 1433 端口上建立TCP連接。

Python實現

端口掃描器原理很簡單,無非就是操作socket,能connect就認定這個端口開放著。

import socket 
def scan(port): 
  s = socket.socket() 
  if s.connect_ex(('localhost', port)) == 0: 
    print port, 'open' 
  s.close() 
if __name__ == '__main__': 
  map(scan,range(1,65536)) 

這樣一個最簡單的端口掃描器出來了。
等等喂,半天都沒反應,那是因為socket是阻塞的,每次連接要等很久才超時。
我們自己給它加上的超時。

s.settimeout(0.1)

再跑一遍,感覺快多了。

多線程版本

import socket 
import threading 
def scan(port): 
  s = socket.socket() 
  s.settimeout(0.1) 
  if s.connect_ex(('localhost', port)) == 0: 
    print port, 'open' 
  s.close() 
 
if __name__ == '__main__': 
  threads = [threading.Thread(target=scan, args=(i,)) for i in xrange(1,65536)] 
  map(lambda x:x.start(),threads) 

運行一下,哇,好快,快到拋出錯誤了。thread.error: can't start new thread。
想一下,這個進程開啟了65535個線程,有兩種可能,一種是超過最大線程數了,一種是超過最大socket句柄數了。在linux可以通過ulimit來修改。
如果不修改最大限制,怎么用多線程不報錯呢?
加個queue,變成生產者-消費者模式,開固定線程。

多線程+隊列版本

import socket 
import threading 
from Queue import Queue 
def scan(port): 
  s = socket.socket() 
  s.settimeout(0.1) 
  if s.connect_ex(('localhost', port)) == 0: 
    print port, 'open' 
  s.close() 
 
def worker(): 
  while not q.empty(): 
    port = q.get() 
    try: 
      scan(port) 
    finally: 
      q.task_done() 
 
if __name__ == '__main__': 
  q = Queue() 
  map(q.put,xrange(1,65535)) 
  threads = [threading.Thread(target=worker) for i in xrange(500)] 
  map(lambda x:x.start(),threads) 
  q.join() 

這里開500個線程,不停的從隊列取任務來做。

multiprocessing+隊列版本
總不能開65535個進程吧?還是用生產者消費者模式

import multiprocessing 
def scan(port): 
  s = socket.socket() 
  s.settimeout(0.1) 
  if s.connect_ex(('localhost', port)) == 0: 
    print port, 'open' 
  s.close() 
 
def worker(q): 
  while not q.empty(): 
    port = q.get() 
    try: 
      scan(port) 
    finally: 
      q.task_done() 
 
if __name__ == '__main__': 
  q = multiprocessing.JoinableQueue() 
  map(q.put,xrange(1,65535)) 
  jobs = [multiprocessing.Process(target=worker, args=(q,)) for i in xrange(100)] 
  map(lambda x:x.start(),jobs) 

注意這里把隊列作為一個參數傳入到worker中去,因為是process safe的queue,不然會報錯。
還有用的是JoinableQueue(),顧名思義就是可以join()的。

gevent的spawn版本

from gevent import monkey; monkey.patch_all(); 
import gevent 
import socket 
... 
if __name__ == '__main__': 
  threads = [gevent.spawn(scan, i) for i in xrange(1,65536)] 
  gevent.joinall(threads) 

注意monkey patch必須在被patch的東西之前import,不然會Exception KeyError.比如不能先import threading,再monkey patch.

gevent的Pool版本

from gevent import monkey; monkey.patch_all(); 
import socket 
from gevent.pool import Pool 
... 
if __name__ == '__main__': 
  pool = Pool(500) 
  pool.map(scan,xrange(1,65536)) 
  pool.join() 

concurrent.futures版本

import socket 
from Queue import Queue 
from concurrent.futures import ThreadPoolExecutor 
... 
if __name__ == '__main__': 
  q = Queue() 
  map(q.put,xrange(1,65536)) 
  with ThreadPoolExecutor(max_workers=500) as executor: 
    for i in range(500): 
      executor.submit(worker,q) 

相關文章

  • python dict.get()和dict[''key'']的區(qū)別詳解

    python dict.get()和dict[''key'']的區(qū)別詳解

    下面小編就為大家?guī)硪黄猵ython dict.get()和dict['key']的區(qū)別詳解。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • 利用Python3實現統計大量單詞中各字母出現的次數和頻率的方法

    利用Python3實現統計大量單詞中各字母出現的次數和頻率的方法

    這篇文章主要介紹了利用Python3實現統計大量單詞中各字母出現的次數和頻率,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Python實現蒙特卡洛算法小實驗過程詳解

    Python實現蒙特卡洛算法小實驗過程詳解

    這篇文章主要介紹了Python實現基于蒙特卡洛算法過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Pyqt5實戰(zhàn)小案例之界面與邏輯分離的小計算器程序

    Pyqt5實戰(zhàn)小案例之界面與邏輯分離的小計算器程序

    網上很多PyQt5信號槽與界面分離的例子,但是真正開發(fā)起來很不方便,下面這篇文章主要給大家介紹了關于Pyqt5實戰(zhàn)小案例之界面與邏輯分離的小計算器程序,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • Python本地及虛擬解釋器配置過程解析

    Python本地及虛擬解釋器配置過程解析

    這篇文章主要介紹了Python本地及虛擬解釋器配置過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • 淺談python 導入模塊和解決文件句柄找不到問題

    淺談python 導入模塊和解決文件句柄找不到問題

    今天小編就為大家分享一篇淺談python 導入模塊和解決文件句柄找不到問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • python 的numpy庫中的mean()函數用法介紹

    python 的numpy庫中的mean()函數用法介紹

    這篇文章主要介紹了python 的numpy庫中的mean()函數用法介紹,具有很好對參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • python 使用elasticsearch 實現翻頁的三種方式

    python 使用elasticsearch 實現翻頁的三種方式

    這篇文章主要介紹了python 使用elasticsearch 實現翻頁的三種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Python設計模式之門面模式簡單示例

    Python設計模式之門面模式簡單示例

    這篇文章主要介紹了Python設計模式之門面模式,簡單描述了門面模式的概念、原理,并結合實例形式給出了Python定義與使用門面模式的具體操作技巧,需要的朋友可以參考下
    2018-01-01
  • Python基于Serializer實現字段驗證及序列化

    Python基于Serializer實現字段驗證及序列化

    這篇文章主要介紹了Python基于Serializer實現字段驗證及序列化,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11

最新評論