handleExit() 函数无法正常工作

问题描述 投票:0回答:2

我基本上是在尝试编写一个 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()
python sys
2个回答
0
投票

问题是

while True:
循环:它永远不会结束,因此你的程序永远不会退出。要修复此问题,请替换循环条件。

这样做:

keep_running = True
def handleExit():
   global keep_running
   ...
   keep_running = False
   ...

while keep_running:
   try:
       handleInput()
   except KeyboardInterrupt:
       handleExit()

0
投票
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 

“这里”没有打印...

© www.soinside.com 2019 - 2024. All rights reserved.