Как исправить проблему со списками в Python 3.6? - PullRequest
0 голосов
/ 19 ноября 2018

Я пишу программу на Python для Сканирование портов

здесь мой исходный код ...

import socket

t_host = str(input("Enter the host to be scanned: "))  

t_ip = socket.gethostbyname(t_host) 

print(t_ip)   

list=[1,3,4,6,7,9,13,17,19,20,21,22,23,24,25,26,30,32,33,37,42,43,49,53,70,79,80,81,82,83,84,85,88,89,90,99,100,106,109,110,111,113,119,125,135,139,143,144,146,161,163,179,199,211,212,222,254,255,256,259,264,280,301,306,311,340,366,389,40]

sock = socket.socket()  

sock.settimeout(1)

for item in list:
    t_port=int(item)
    result = sock.connect_ex((t_ip,t_port)) 
    if result == 0:
        print("Port",t_port,": Opened")
    else:
        print("port",t_port,": Closed")
    sock.close()

print("Port Scanning complete")

когда я использую один элемент в списке, он сканирует и дает порт, открытый / закрытый правильно. (Т. Е.) Первый элемент в списке оценивается правильно, тогда как оставшиеся не оцениваются как открытый или закрытый правильно

например. list=[80] это дает вывод как открытый правильно.

Но если список содержит более одного элемента, он дает Закрыт для всех портов

например. list=[80,23,443,25] выводит как port 80 : Opened, но остальные закрыты

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Ваша проблема не связана со списком портов, но объект сокета, который вы используете несколько раз.

После закрытия сокета его нельзя использовать повторно :

Пометить розетку как закрытую. Базовый системный ресурс (например, файловый дескриптор) также закрывается, когда все файловые объекты из makefile () закрыты. Как только это произойдет, все будущие операции с объектом сокета завершатся неудачно. Удаленный конец больше не будет получать данные (после сброса данных в очереди).

Возможно, вы захотите создать новый сокет для каждого сканируемого порта:

import socket

t_host = str(input("Enter the host to be scanned: "))
t_ip = socket.gethostbyname(t_host)

print(t_ip)
list=[1,3,4,6,7,9,13,17,19,20,21,22,23,24,25,26,30,32,33,37,42,43,49,53,70,79,80,81,82,83,84,85,88,89,90,99,100,106,109,110,111,113,119,125,135,139,143,144,146,161,163,179,199,211,212,222,254,255,256,259,264,280,301,306,311,340,366,389,40]

for item in list:
    t_port=int(item)

    # create a new socket for each port scanned
    sock = socket.socket()
    sock.settimeout(1)

    # probe port
    result = sock.connect_ex((t_ip,t_port))
    if result == 0:
        print("Port",t_port,": Opened")
    else:
        print("port",t_port,": Closed")
    sock.close()
0 голосов
/ 19 ноября 2018

Вы не можете использовать один и тот же сокет для нескольких соединений.Вам необходимо каждый раз создавать новый сокет в цикле.

for item in list:
    t_port=int(item)
    sock = socket.socket()  
    sock.settimeout(1)
    result = sock.connect_ex((t_ip,t_port)) 
    if result == 0:
        print("Port",t_port,": Opened")
    else:
        print("port",t_port,": Closed")
    sock.close()

Из документации socket.close():

Все будущие операции надобъект сокета потерпит неудачу.

...