【发布时间】:2019-10-17 21:46:02
【问题描述】:
我正在尝试制作我的第一个程序,一个显示远程服务器上所有开放端口的端口扫描程序,我已经让它在 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/try 错误地使其循环,但我真的看不出我做错了什么,因为我几乎不知道我作为一个新手在做什么。
【问题讨论】: