2010-03-01 68 views
0

我正在嘗試測試連接失敗,但不幸的是,如果主機的IP地址被防火牆覆蓋,則不會失敗。Python DBAPI超時連接?

這是代碼:

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: 

如果我嘗試連接到一個已知的服務器,但給不正確的用戶名,將觸發異常和故障。

但是,如果我嘗試連接到一臺機器不響應(防火牆),它永遠不會被傳遞self.conn = pgdb.connect()

如何我等待或測試超時,而不是讓我的應用程序似乎掛起當用戶輸入錯誤一個IP地址?

+0

拼寫/語法納茲時間:Pythobn - > Python,防火牆 - >防火牆。哦,看起來,最後一行並沒有被四個空格縮進。 – 2010-03-01 11:36:23

回答

0

你遇到的是防火牆的痛苦,超時是正常的TCP超時。

+0

s/of防火牆/愚蠢,「偏執」防火牆/它實際上是DROP規則的結果。正確的方法是實際回覆一個tcp-reset ICMP包(IIRC)。 – 2010-03-01 11:35:42

0

您通常可以在連接功能中傳遞超時參數。如果它不存在,你可以嘗試用socket.timeout或default timeout

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

這將適用此設置所有連接(基於套接字)您撥打和等待10秒後會失敗。