Я пытаюсь сделать мою первую программу, сканер портов, который показывает все открытые порты на удаленном сервере, я заставил его работать в CLI (благодаря интернету), но решил сделать GUI (Qt5) за это. Я хочу, чтобы textbox2 выводил все открытые порты после ввода IP-адреса и нажатия «Сканировать!», И, очевидно, чтобы программа не вылетала после нажатия на нее. Вот соответствующий код для репликации проблемы
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QPushButton, QAction, QLineEdit, QMessageBox, QPlainTextEdit, QVBoxLayout, QLabel
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot, Qt
import socket
import time
import sys
class App(QMainWindow):
def __init__(self):
super().__init__()
self.title = 'PPort'
self.left = 10
self.top = 10
self.width = 800
self.height = 400
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
self.label = QLabel('Enter Target Address:', self)
self.label.move(50, -110)
self.label.resize(300, 300)
self.label2 = QLabel('Output:', self)
self.label2.move(50, 80)
self.label2.resize(300, 300)
self.textbox = QLineEdit(self)
self.textbox.move(50, 60)
self.textbox.resize(540, 30)
self.textbox2 = QPlainTextEdit(self)
self.textbox2.move(50, 250)
self.textbox2.resize(700, 100)
self.textbox2.setReadOnly(True)
self.button = QPushButton('Scan!', self)
self.button.move(620, 60)
self.button.clicked.connect(self.on_click)
self.show()
@pyqtSlot()
def on_click(self):
textboxValue = self.textbox.text()
socket.gethostbyname(textboxValue)
try:
for port in range(1, 1025):
socketprofile = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = socketprofile.connect_ex((textboxValue, port))
if result == 0:
self.textbox2.appendPlainText('Port {} Is open'.format(port))
socketprofile.close()
except socket.gaierror:
self.textbox2.appendPlainText('Hostname could not be resolved')
time.sleep(5)
sys.exit()
except socket.error:
self.textbox2.appendPlainText("Couldn't connect to server")
time.sleep(5)
sys.exit()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
В textbox2 не отображается никаких ошибок, мне странно то, что даже когда я заменяю self.textbox2.appendPlainText
на print (), он по-прежнему не выводитсялюбые сообщения об ошибках в терминале vscode. Однако при вводе неверного IP-адреса отображается gaierror (не удалось разрешить хост), причем не в textbox2, а в терминале, по сравнению с тем, как всегда происходит сбой при вводе действительного IP-адреса (8.8.8.8, 192.168.0.1). ,Я подозреваю, что использую if / for / пытаюсь ошибочно сделать цикл, но я не могу понять, что я делаю неправильно, потому что я едва знаю, что я делаю, как новичок.