我基本上是在尝试编写一个 C2 服务器代码来了解 python 网络和实际的 python 基础知识。 我来自 C 和 Java,我不太了解 python 最佳实践,哈哈,我知道我正在递归地运行函数,但我真的不知道应该如何做我想做的事情。 基本上这个概念是处理命令,但也捕捉“CTRL+C”。当我“CTRL + C”或输入 exit 时,我想终止我的程序并关闭套接字/线程,但它不起作用,提示行闪烁,因为某些东西仍在运行......我认为这不是 sys.exit(0) 错误,但我不明白为什么这不起作用。
import socket
import threading
import os
import sys
from pyfiglet import figlet_format
serverSocket = None
clientSocket = None
acceptThread = None
clientAddress = None
def handleInput():
i = input("SmoothArmy => ").lower()
if i == "exit":
handleExit()
elif i == "help":
helpCommand()
elif i == "listen":
startListener(9001)
else:
print("That command doesn't exist.")
def helpCommand():
print("List of available Commands:\n")
print("----------------------------------------------------------------------------------------\n")
print("help : Shows available Commands\n")
print("exit : To terminate session\n")
print("listen <port> : Listen on a port\n")
#put stuff before these line
print("------------------------------------------------------------------------------------------\n")
def startListener(port):
try:
global serverSocket
global acceptThread
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serverSocket.bind((socket.gethostname(), port))
serverSocket.listen(10)
print(f"listening on port {port}...")
acceptThread = threading.Thread(target=acceptClients)
acceptThread.start()
pass
except:
print("There was an error starting socket...")
pass
def acceptClients():
while True:
global clientSocket
global clientAddress
clientSocket, clientAddress = serverSocket.accept()
print(f"Connection from {clientAddress} has been established!")
def handleExit():
try:
i = input("\nDo you want to exit? (y|n) ")
if i == "y":
if acceptThread != None and clientSocket != None and serverSocket != None:
acceptThread.stop()
clientSocket.shutdown(1)
clientSocket.close()
serverSocket.shutdown(1)
serverSocket.close()
sys.exit(0)
else:
sys.exit(0)
else:
pass
except KeyboardInterrupt:
handleExit()
print(figlet_format("SmoothArmy", font="standard"))
print(" __ ")
print(" _(\ |@@|")
print("(__/\__ \--/ ")
print(" \___|----| | __")
print(" \ }{ /\ )_ / _\\")
print(" /\__/\ \__O (__")
print(" (--/\--) \__/")
print(" _)( )(_")
print(" `---''---`")
print("\n")
while True:
try:
handleInput()
except KeyboardInterrupt:
handleExit()
问题是
while True:
循环:它永远不会结束,因此你的程序永远不会退出。要修复此问题,请替换循环条件。
这样做:
keep_running = True
def handleExit():
global keep_running
...
keep_running = False
...
while keep_running:
try:
handleInput()
except KeyboardInterrupt:
handleExit()
def startListener(port):
try:
global serverSocket
global acceptThread
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serverSocket.bind((socket.gethostname(), port))
serverSocket.listen(10)
print(f"listening on port {port}...")
acceptThread = threading.Thread(target=acceptClients)
acceptThread.start()
sys.exit(0)
print("Here")
except Exception as e:
print("There was an error starting socket...")
print(e)
pass
“这里”没有打印...