2010-10-11 31 views
0

ici est mon petit serveur web sale:Python: Fermeture d'une prise déjà ouvert par un programme python précédent ou sale tour pour fermer une prise

class Serverhttp: 
def __init__(self): 
    self.GET = re.compile("GET.*?HTTP") 
    self.POST = re.compile("POST.*?HTTP") 
    try : 
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     server_address = ('localhost', 36000) 
     print >>sys.stderr, 'starting up on %s port %s' % server_address 
     sock.bind(server_address) 
    except : 
     time.sleep(2) 
     self.__init__() 
    # Listen for incoming connections 
    sock.listen(1) 
    off = 2 
    self.message = "" 
    while True: 
     # Wait for a connection 
     print >>sys.stderr, 'waiting for a connection' 
     if off == 2 or off == 1: 
      connection, client_address = sock.accept() 
     try: 
      print >>sys.stderr, 'connection from', client_address 

      # Receive the data in small chunks and retransmit it 
      while True: 
       data = connection.recv(1024) 
       print >>sys.stderr, 'received "%s"' % data 
       if data: 
        self.message = self.traitement(data) 
        connection.sendall(self.message) 
        connection.close() 
        connection, client_address = sock.accept() 

       else: 
        print >>sys.stderr, 'no more data from', client_address 
        break 

     finally: 
      # Clean up the connection 
      connection.close() 
      sock.close() 
      del(sock) 

il fonctionne plus ou moins, mais si je quitte le serveur le port est toujours ouvert et je ne peux pas me reconnecter sur le même port. Donc je cherche un moyen de tuer le précédent ou de sortir de manière agréable. Cordialement et merci

Bussiere

+1

-1: Écrire le vôtre lorsque vous pourriez utiliser 'wsgiref' ou' BaseHTTPServer' qui sont déjà intégrés dans les bibliothèques. Si vous n'utilisez pas le serveur HTTP intégré, arrêtez d'utiliser la bibliothèque de socket intégrée et utilisez directement le pilote '/ dev/eth'. –

Répondre

3

sock.setsockopt (socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

devrait faire l'affaire.

+0

il l'a fait merci beaucoup et estime pour cette réponse. – user462794