我正在大学学习网络安全,我对恶意软件和这类东西很感兴趣。出于好奇,我正在尝试编写一个僵尸网络 + 控制服务器,以了解更多关于它们如何工作的信息。我的控制服务器由一个带有套接字服务器的线程和一个用于发出命令的 flask REST API 组成。在没有套接字监听器运行的情况下,flask API 运行良好,反之亦然。但如果我尝试同时运行 flask api 和套接字监听器,我会得到 OSError: [Errno 98] Address already in use
.
我正在用 sock.bind(("0.0.0.0", 6505))
绑定(bind)我的套接字并使用 app.run("0.0.0.0", 6506)
启动我的 flask 服务器
我也在使用 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
我尝试过的事情:
更新:
发生了一些奇怪的事情,如果我先运行 flask 服务器,我没有收到错误,但套接字服务器没有启动。但是,如果我先运行套接字服务器,则会收到错误消息,并且它们都没有运行
Update2:这是我的一些代码:
更新3:
我尝试将 flask 网络服务器移动到线程中并移动我的套接字监听器,但似乎网络服务器阻塞了我的监听器。当我切换它们时,我没有收到任何错误,并且 lsof 报告两个端口都有一个 python 进程在监听它们,我可以连接到网络服务器,但套接字似乎超时,但不是立即超时。套接字肯定在运行,但似乎由于某种原因它无法运行任何代码。一世
Update4:我尝试在设置套接字服务器的函数中放置一些打印语句,结果由于 flask 服务器自动重新加载,它运行了两次!我想我需要禁用自动重新加载,它会解决我的问题
### WEB ROUTES ###
app = Flask(__name__)
@app.route("/ping", methods=["POST"])
def ping():
return "FAKE PING"
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((self.HOST, self.PORT))
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.listen(0)
sock.settimeout(10)
# Thread that handles new client connections
listen_thread = Thread(target=listen)
listen_thread.start()
app.config["DEBUG"] = True
app.run("0.0.0.0", 5407)
顺便说一句,我不在乎我是否没有以最好的方式做到这一点,我只是在使用这个项目来学习,这没有任何意义。我也是个带 socket 的菜鸟,所以¯_(ツ)_/¯
我做错了什么还是我不了解网络?
最佳答案
flask 自动重新加载会导致代码在不关闭原始套接字的情况下重新启动,因此套接字试图第二次绑定(bind)到地址/端口。为了解决这个问题,我使用以下方法禁用了重新加载器:
from werkzeug.serving import run_simple
run_simple("0.0.0.0", 5407, app, use_reloader=False)
关于python - 在同一脚本(python)中使用套接字服务器和 flask 网络服务器时地址已在使用中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63891283/