2014-12-05 9 views
7

Ich übersetze Hostname in IPv4-Adresse mit gethostbyname() von socket in Python. Manchmal dauert es etwas länger, bis die IP-Adresse angezeigt wird. Ich habe mich gefragt, ob es für jede Suche einen Standard-Timeout-Wert gibt. Hier ist, wie ich bin mit Buchse in meinem Programm-Gibt es einen Timeout-Wert für socket.Gethostbyname (Hostname) in Python?

try: 
    addr = socket.gethostbyname(hostname) 
except socket.gaierror: 
    addr = "" 
print hostname+" : "+addr 

Nur muß eine andere Frage hinzuzufügen, gibt es eine Chance, dass diese beliebige IP-Adresse verfehlen? Hatte jemand Erfahrung damit, große Beispiele von Hostnamen in IP-Adressen umzuwandeln?

+0

Es scheint keine Möglichkeit zu sein, das Timeout von 'gethostbyname' zu ​​steuern, aber Sie könnten lieber das Standard-Timeout des Socket-Objekts mit' sock 'setzen et.setdefaulttimeout (timeout) '. –

+0

@LordHenryWotton das kann getan werden, aber ich frage mich, ob jemand IP-Adressen nicht übereinstimmte und es vermisst jede IP-Adresse mit gethostbyname(). Wenn es fehlschlägt, dann würde die Einstellung des Timeout-Wertes es lösen oder nicht. – saz

+3

@LordHenryWotton: Ich bezweifle, dass 'socket.setdefaulttimeout' 'gethostbyname' betrifft. Ich denke, es wird nur Operationen an bestimmten Sockets beeinflussen, also lesen, schreiben, verbinden. Aber 'socket.gethostbyname' ist keine Operation auf einem bestimmten Socket, sondern ein blockierender Aufruf in libc gethostbyname (3). Siehe auch http://www.gossamer-threads.com/lists/python/python/790534 –

Antwort

1

Hier ist die gesamte Socket Timeout-Datei.

import socket 

try: 
    _GLOBAL_DEFAULT_TIMEOUT = socket._GLOBAL_DEFAULT_TIMEOUT 
except AttributeError: 
    _GLOBAL_DEFAULT_TIMEOUT = object() 

Wie Sie sehen können, GLOBAL_DEFAULT_TIMEOUT = object() ist ein nur ein leeres Objekt zu schaffen.

socket.setsocketimeout wird das Standard-Timeout für neue Sockets festlegen. Wenn Sie die Sockets nicht direkt verwenden, kann die Einstellung jedoch leicht überschrieben werden.

Weitere Informationen finden Sie unter this answer.

EDIT: Wie für Ihre Follow-up-Frage, ja. Ich habe ein Programm erstellt, das den Hostnamen für die IP-Adresskonvertierung enthielt, und ich hatte Probleme mit fehlenden Adressen. Nicht sicher, ob das wegen einer Zeitüberschreitung war. Ich musste es einfach überprüfen.

+0

Danke. nur wundernd, haben Sie etwas in dem Programm getan, um fehlende Adresse Problem zu lösen oder nur manuell überprüft? – saz

+0

Nichts zu schlau oder schick. Ich hatte gerade die Programmschleife mehr als einmal, und es funktionierte normalerweise gut. –

0

Hier ist ein Beispiel des Alarmsignals unter Verwendung (für POSIX-Typ-Systeme) für socket.gethostbyname einen Timeout einzustellen:

Setup-Code:

from contextlib import contextmanager 
import signal 

def raise_error(signum, frame): 
    """This handler will raise an error inside gethostbyname""" 
    raise OSError 

@contextmanager 
def set_signal(signum, handler): 
    """Temporarily set signal""" 
    old_handler = signal.getsignal(signum) 
    signal.signal(signum, handler) 
    try: 
     yield 
    finally: 
     signal.signal(signum, old_handler) 

@contextmanager 
def set_alarm(time): 
    """Temporarily set alarm""" 
    signal.setitimer(signal.ITIMER_REAL, time) 
    try: 
     yield 
    finally: 
     signal.setitimer(signal.ITIMER_REAL, 0) # Disable alarm 

@contextmanager 
def raise_on_timeout(time): 
    """This context manager will raise an OSError unless 
    The with scope is exited in time.""" 
    with set_signal(signal.SIGALRM, raise_error): 
     with set_alarm(time): 
      yield 

Ausführungscode

import socket 
try: 
    with raise_on_timeout(0.1): # Timeout in 100 milliseconds 
     print(socket.gethostbyname(socket.gethostname())) 
except OSError: 
    print("Could not gethostbyname in time") 
Verwandte Themen