[PYTHON] Richten Sie einen Server ein, der mehrere Verbindungen gleichzeitig verarbeitet

Wir sehen oft Beispiele für die Verwendung von "SocketServer.TCPServer" zum Einrichten eines TCP-Servers in Python.

SocketServer.Beispiel mit TCP Server


import SocketServer

HOST, PORT = "", 12345

class SampleHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        client = self.request
        address = self.client_address[0]
        client.send("May I ask your name? ")
        name = client.recv(80).strip()
        self.request.send("Welcome %s from %s\n" % (name, address))

if __name__ == "__main__":
    server = SocketServer.TCPServer((HOST, PORT), SampleHandler)
    server.serve_forever()

Damit kann jedoch immer nur eine Verbindung gleichzeitig verarbeitet werden. Wenn während der Verarbeitung eine neue Verbindungsanforderung eingeht, wird gewartet, bis die vorherige Verarbeitung abgeschlossen ist. Ändern Sie einfach diesen SocketServer.TCPServer in`` SocketServer.ThreadingTCPServer` und Sie können mehrere Verbindungen gleichzeitig verarbeiten.

py:SocketServer.TCP Server Socket Server.Wechseln Sie zu Threading TCP Server(Nur Hauptteil)


if __name__ == "__main__":
    server = SocketServer.ThreadingTCPServer((HOST, PORT), SampleHandler)
    server.serve_forever()

Da sich jedoch die Anzahl der verwendeten Sockets erhöht, ist es ratsam, Maßnahmen zu ergreifen, z. B. die Obergrenze für die Anzahl der Verbindungen mit iptables festzulegen und die TIME_WAIT-Zeit mit sysctl zu verkürzen. Bitte passen Sie die Obergrenze und die Zeit entsprechend dem Service an.

Begrenzt auf 15 Verbindungen von einer IP-Adresse in den Einstellungen von iptables


-A INPUT -p tcp -m tcp --dport 12345 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 15 --connlimit-mask 32 --connlimit-saddr -j REJECT --reject-with tcp-reset

/etc/sysctl.ZEIT in conf_Wartezeit auf 15 Sekunden reduziert(60 Sekunden, wenn nicht eingestellt)


net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15

Wenn ein Neustart des Skripts einen Fehler bei der Verwendung der Adresse verursacht, empfiehlt es sich, die Einstellung für die Wiederverwendung von Adressen auf der Skriptseite wie folgt festzulegen.

import SocketServer
import socket

HOST, PORT = "", 12345

class SampleHandler(SocketServer.BaseRequestHandler, object):
    def handle(self):
        client = self.request
        address = self.client_address[0]
        client.send("May I ask your name? ")
        name = client.recv(80).strip()
        self.request.send("Welcome %s from %s\n" % (name, address))

class SampleServer(SocketServer.ThreadingTCPServer, object):
    def server_bind(self):
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.socket.bind(self.server_address)

if __name__ == "__main__":
    server = SampleServer((HOST, PORT), SampleHandler)
    server.serve_forever()

Ich habe versucht, ungefähr zwei CTF-Problemserver mit ThreadingTCPServer zu betreiben.

SECCON CTF 2014 winter online qualifications Choose the number : https://github.com/shiracamus/seccon2014/blob/master/number/number.py Let's disassemble : https://github.com/shiracamus/seccon2014/blob/master/disassemble/disassemble.py

Recommended Posts

Richten Sie einen Server ein, der mehrere Verbindungen gleichzeitig verarbeitet
Drehen Sie in Python mehrere Listen mit for-Anweisung gleichzeitig
Richten Sie mit Docker einen Samba-Server ein
So stellen Sie die Serverzeit auf japanische Zeit ein
Richten Sie mit Twisted einen Mailserver ein
Zeichnen Sie mit Pythons Matplotlib mehrere Karten und Daten gleichzeitig
Richten Sie einen einfachen HTTPS-Server mit Asyncio ein
Richten Sie einen lokalen Server mit Go-File-Upload ein.
Richten Sie einen Test-SMTP-Server in Python ein.
Programm zur Suche nach demselben Bild
Richten Sie einen UDP-Server in der Sprache C ein
Typkonvertierung mehrerer Spalten von Pandas DataFrame mit Astype gleichzeitig
Schleifen Sie gleichzeitig Variablen in der Vorlage
So richten Sie einen lokalen Entwicklungsserver ein
Richten Sie einen einfachen SMTP-Server in Python ein
Suchen Sie eine Richtlinie für die Anzahl der Prozesse / Threads, die auf dem Anwendungsserver festgelegt werden sollen
Richten Sie einen einfachen lokalen Server auf Ihrem Mac ein
[GoLang] Setzen Sie am Anfang des Kommentars ein Leerzeichen
Richten Sie einen Minecraft-Ressourcenserver (Spigot) über Docker (2) ein.
Richten Sie mit Samba einen Dateiserver unter Ubuntu 20.04 ein
Visualisieren Sie Daten und erfassen Sie gleichzeitig die Korrelation
Die Geschichte, eine harte Zeit mit der gemeinsamen Menge HTTP_PROXY = ~ zu haben
Richten Sie in 30 Minuten einen kostenlosen Server unter AWS ein
Richten Sie einen Minecraft-Ressourcenserver (Spigot) über Docker ein
[Vagrant] Richten Sie einen einfachen API-Server mit Python ein
So richten Sie einen einfachen SMTP-Server ein, der lokal in Python getestet werden kann
wxPython: Gleichzeitiges Zeichnen von Animationen und Grafiken
Starten Sie einen einfachen WEB-Server, der den Header überprüfen kann
Richten Sie einen Webserver mit CentOS7 + Anaconda + Django + Apache ein
Grep, damit grep zum Zeitpunkt von grep nicht angezeigt wird
Laden Sie den mit Gunicorn eingerichteten Server neu, wenn Sie den Code ändern
Obwohl es diesmal ist, werde ich zu Hause einen Linux-Server einrichten. Ich werde später darüber nachdenken, wie man es benutzt.
[Python 3.8 ~] Schreiben Sie Arrays usw. gleichzeitig mit der Definition neu [Tipps]
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
Durchsuchen Sie .loc und .iloc gleichzeitig in pandas DataFrame
Da ich zu verschiedenen Zeiten anfing zu arbeiten, machte ich einen Bot, der mir die Zeit sagt, die Arbeit zu verlassen
Legen Sie den clientspezifischen SSH-Hostschlüssel auf mehreren plattenlosen Clients fest, die genau dasselbe Root-Dateisystem verwenden
Richten Sie mit Python einen Dummy-SMTP-Server ein und überprüfen Sie den Sendevorgang von Action Mailer