2010-03-01 5 views
0

J'essayais de tester l'échec de la connexion, et malheureusement, il ne manque pas si l'adresse IP de l'hôte est firewalled.Python DBAPI délai d'attente pour les connexions?

Voici le code:

def get_connection(self, conn_data): 
    rtu, hst, prt, usr, pwd, db = conn_data 
    try: 
     self.conn = pgdb.connect(host=hst+":"+prt, user=usr, password=pwd, database=db) 
     self.cur = self.conn.cursor() 
     return True 
    except pgdb.Error as e: 
     logger.exception("Error trying to connect to the server.") 
     return False 

if self.get_connection(conn_data): 
    # Do stuff here: 

Si je tente de se connecter à un serveur connu, mais donner un nom d'utilisateur incorrect, il déclenche l'exception et l'échec.

Cependant, si je tente de se connecter à une machine qui ne répond pas (firewalled), il ne se passe self.conn = pgdb.connect()

Comment j'attendre ou un test pour le temps plutôt que de mon application semble se bloquer lorsque un mistypes utilisateur une adresse IP?

+0

Orthographe/grammaire-nazie: Python -> Python, feu -> pare-feu. Oh, et la dernière ligne n'est pas indentée par quatre espaces, semble-t-il. –

Répondre

0

Ce que vous rencontrez est la douleur des pare-feu, et le délai d'expiration est le délai TCP normal.

+0

s/de firewalls/de pare-feu stupides, "paranoïaques"/C'est en fait le résultat d'une règle DROP. La bonne façon est de répondre avec un paquet ICMP tcp-reset (IIRC). –

0

Vous pouvez généralement passer l'argument timeout dans la fonction de connexion. Si elle n'existe pas, vous pouvez essayer avec socket.timeout ou default timeout:

import socket 
socket.setdefaulttimeout(10) # sets timeout to 10 seconds 

Cela appliquer ce paramètre à toutes les connexions (prise en fonction) que vous faites et échouera au bout de 10 secondes d'attente.

Questions connexes