Сканер портов с резьбой с использованием сокетов в Python

Опубликовано: 12 Апреля, 2022

Сканирование портов может быть очень медленным, но в большинстве случаев не требует интенсивного процесса. Таким образом, мы можем использовать потоки для повышения скорости. Может быть тысячи возможных портов. Если сканирование каждого порта занимает 5–15 секунд, то нам, возможно, придется долго ждать без использования потоковой передачи.

Резьба

Многопоточность - сложная тема, но ее можно разбить и концептуализировать как методологию, с помощью которой мы можем сказать компьютеру выполнить другую задачу, если процессор находится в состоянии простоя. В случае сканирования портов мы тратим много времени, просто ожидая ответа от сервера. Пока ждем, мы можем заняться чем-нибудь еще. Вот для чего используется многопоточность.

Example: In this program, we can scan a number of ports in a certain range.

Python3

import threading
from queue import Queue
import time
import socket
  
# a print_lock is used to prevent "double"
# modification of shared variables this is
# used so that while one thread is using a
# variable others cannot access it Once it
# is done, the thread releases the print_lock.
# In order to use it, we want to specify a
# print_lock per thing you wish to print_lock.
print_lock = threading.Lock()
  
# ip = socket.gethostbyname(target)
target = "localhost"
  
def portscan(port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        con = s.connect((target, port))
        with print_lock:
            print("port is open", port)
        con.close()
    except:
        print("port is close", port)
  
  
# The threader thread pulls a worker 
# from a queue and processes it
def threader():
    while True:
        # gets a worker from the queue
        worker = q.get()
  
        # Run the example job with the available 
        # worker in queue (thread)
        portscan(worker)
  
        # completed with the job
        q.task_done()
  
  
# Creating the queue and threader
q = Queue()
  
# number of threads are we going to allow for
for x in range(4):
    t = threading.Thread(target=threader)
  
    # classifying as a daemon, so they it will
    # die when the main dies
    t.daemon = True
  
    # begins, must come after daemon definition
    t.start()
  
  
start = time.time()
  
# 10 jobs assigned.
for worker in range(1, 10):
    q.put(worker)
  
# wait till the thread terminates.
q.join()

Выход:

 порт закрыт 2
порт закрыт порт закрыт 4
порт близокпорт близок 1
 53

порт близок 6порт близок
 7
порт закрыт 8
порт закрыт 9

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.