[PYTHON] Configurer un serveur qui traite plusieurs connexions en même temps

Nous voyons souvent des exemples d'utilisation de SocketServer.TCPServer pour configurer un serveur TCP en python.

SocketServer.Exemple utilisant le serveur TCP


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()

Cependant, avec cela, une seule connexion peut être traitée à la fois, et si une nouvelle demande de connexion arrive pendant le traitement, elle attendra la fin du traitement précédent. Changez simplement ce «SocketServer.TCPServer» en «SocketServer.ThreadingTCPServer» et vous serez en mesure de gérer plusieurs connexions en même temps.

py:SocketServer.Serveur de socket du serveur TCP.Passer au serveur TCP Threading(Partie principale uniquement)


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

Cependant, étant donné que le nombre de sockets utilisés augmentera, il est conseillé de prendre des mesures telles que définir la limite supérieure du nombre de connexions avec iptables et raccourcir le temps TIME_WAIT avec sysctl. Veuillez ajuster la limite supérieure et l'heure en fonction du service.

Limité à 15 connexions à partir d'une adresse IP dans les paramètres 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.TIME en conf_Temps d'attente réduit à 15 secondes(60 secondes lorsqu'il n'est pas réglé)


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

De plus, si le redémarrage du script provoque une erreur lors de l'utilisation de l'adresse, il est conseillé de définir le paramètre de réutilisation d'adresse du côté du script comme suit.

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()

J'ai essayé de faire fonctionner environ deux serveurs à problèmes CTF en utilisant ThreadingTCPServer.

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

Configurer un serveur qui traite plusieurs connexions en même temps
Transformez plusieurs listes avec l'instruction for en même temps en Python
Configurer un serveur Samba avec Docker
Comment régler l'heure du serveur sur l'heure japonaise
Configurer un serveur de messagerie avec Twisted
Tracez plusieurs cartes et données en même temps avec matplotlib de Python
Configurer un serveur HTTPS simple avec asyncio
Configurer un serveur local avec le téléchargement Go-File-
Configurez un serveur SMTP de test en Python.
Programme pour rechercher la même image
Configurer un serveur UDP en langage C
Conversion de type de plusieurs colonnes de pandas DataFrame avec un type en même temps
Boucle les variables en même temps dans le modèle
Comment configurer un serveur de développement local
Configurer un serveur SMTP simple en Python
Trouvez une ligne directrice pour le nombre de processus / threads à définir sur le serveur d'applications
Configurer un serveur local simple sur votre Mac
[GoLang] Définissez un espace au début du commentaire
Configurer un serveur de ressources Minecraft (Spigot) via docker (2)
Configurer un serveur de fichiers sur Ubuntu 20.04 à l'aide de Samba
Visualisez les données et saisissez la corrélation en même temps
Une histoire qui a eu du mal avec l'ensemble commun HTTP_PROXY = ~
Configurez un serveur gratuit sur AWS en 30 minutes
Configurer un serveur de ressources Minecraft (Spigot) via docker
[Vagrant] Configurer un serveur API simple avec python
Comment configurer un serveur SMTP simple qui peut être testé localement en Python
wxPython: dessin simultané d'animation et de dessin graphique
Lancez un serveur WEB simple qui peut vérifier l'en-tête
Configurer un serveur Web avec CentOS7 + Anaconda + Django + Apache
Grep pour que grep n'apparaisse pas au moment de grep
Recharger le serveur configuré avec gunicorn lors du changement de code
Même si c'est cette fois, je vais installer un serveur Linux chez moi. Je réfléchirai à comment l'utiliser plus tard.
[Python 3.8 ~] Réécrire des tableaux etc. en même temps que la définition [astuces]
Une fonction qui mesure le temps de traitement d'une méthode en python
Parcourir .loc et .iloc en même temps dans pandas DataFrame
Depuis que j'ai commencé à travailler à des moments différents, j'ai créé un Bot qui me dit l'heure de quitter le travail
Définissez la clé d'hôte ssh spécifique au client sur plusieurs clients sans disque qui utilisent exactement le même système de fichiers racine
Configurer un serveur SMTP factice avec Python et vérifier le fonctionnement de l'envoi depuis Action Mailer