1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
| #!/usr/bin/python
# -*- coding: utf-8 -*-
# Importation des modules
import sys
import argparse
import getopt
import threading
import socket
import urllib2
# Déclaration de l'IP de de l'addresse d'écoute
SCRIPT = __file__
HOST = ''
PORT = ''
# Fonction affichant le menu d'aide
def usage():
# Création d'un parser avec description et epilogue pour un exemple
parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter,
description="Parameters required for " + SCRIPT + " script...",
epilog="Example :\npython " + SCRIPT + " -s 192.168.1.1 -p 8000\r\n\r\n")
# Ajout des arguments possibles
parser.add_argument('-s', '--src-ip', action = 'store_true', help='Source IP address')
parser.add_argument("-p", '--src-port', action = 'store_true', help="Source port")
# On parse les arguments
args = parser.parse_args()
# On affiche le résultat
print(args.echo)
# Fonction validant les paramètres d'entrée
def check_arguments(argv):
# Récupération des variables globales
global HOST
global PORT
# Gestion d'erreur
try :
opts, args = getopt.getopt(argv,"h:s:p:", ["help", "src-ip=", "src-port="])
except getopt.GetoptError :
usage()
sys.exit(2)
# Sauvegarde des paramètres
for opt, arg in opts :
if opt in ('-h', '--help'):
usage()
sys.exit(2)
elif opt in ('-s', '--src-ip'):
HOST = arg
elif opt in ('-p', '--src-port'):
PORT = int(arg)
# Vérification qu'aucun des paramètres ne soit vide
if HOST == "" or PORT == "" :
if HOST == "" :
print "\nAddresse IP d'écoute non renseignée...\n"
if PORT == "" :
print "\nPort d'écoute non renseigné...\n"
sys.exit(2)
# Déclaration de la classe
class ClientThread(threading.Thread):
# Objet thread gérant la réception des nouvelles connexions
def __init__(self, ip, port, clientsocket):
threading.Thread.__init__(self)
self.ip = ip
self.port = port
self.clientsocket = clientsocket
print ("Connexion entrante depuis %s sur son port %s" % (self.ip, self.port, ))
# Réponse du serveur
def run(self):
# C'est là ou çà coince
#
# XXXX
#
#
print ("Déconnexion du client %s..." % (self.ip))
# Démarrage du programme
if __name__ == "__main__":
# Validation des paramètres d'entrée
check_arguments(sys.argv[1:])
# Création d'une socket TCP IPV4
tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Ajout de l'option SO_REUSEADDR afin de rendre immédiatement le port disponible après utilisation
tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# On bind la socket sur l'IP et PORT demandés
tcpsock.bind((HOST,PORT))
# Bloucle continue
while True:
# Ecoute avec une file d'attente maximale de 5 connexions
tcpsock.listen(5)
# Accepte la connexion, en récupérant les informations de l'émetteur
(clientsocket, (ip, port)) = tcpsock.accept()
# Création de l'objet thread pour gérer la connexion
newthread = ClientThread(ip, port, clientsocket)
newthread.start() |
Partager