2014-12-05 3 views
7

Sto traducendo il nome host in indirizzo IPv4 utilizzando gethostbyname() di socket in python. A volte ci vuole un po 'di tempo in più per mostrare l'indirizzo IP. Mi stavo chiedendo se ci sia un valore di timeout predefinito per ogni ricerca. Ecco come sto usando presa nel mio programma-esiste un valore di timeout per socket.gethostbyname (hostname) in python?

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

solo bisogno di aggiungere un'altra domanda, c'è qualche possibilità che questo può mancare qualsiasi indirizzo IP? Qualcuno ha avuto esperienza nel convertire un ampio campione di hostname in un indirizzo IP?

+0

Ci non sembra essere un modo per controllare il timeout di 'gethostbyname', ma potresti piuttosto impostare il timeout predefinito dell'oggetto socket con' sock et.setdefaulttimeout (timeout) '. –

+0

@LordHenryWotton che può essere fatto, ma mi chiedo se qualcuno ha trovato una mancata corrispondenza degli indirizzi IP e manca qualsiasi IP utilizzando gethostbyname(). se manca, l'impostazione del valore di timeout lo risolverebbe o meno. – saz

+3

@LordHenryWotton: dubito che 'socket.setdefaulttimeout' influenzi' gethostbyname'. Penso che influenzerà solo le operazioni su socket specifici, cioè lettura, scrittura, connessione. Ma 'socket.gethostbyname' non è un'operazione su un socket specifico ma invece una chiamata di blocco in libc gethostbyname (3). Vedi anche http://www.gossamer-threads.com/lists/python/python/790534 –

risposta

1

Ecco l'intero file di timeout Socket.

import socket 

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

Come si può vedere, è un GLOBAL_DEFAULT_TIMEOUT = object() solo la creazione di un oggetto vuoto.

socket.setsocketimeout imposta il timeout predefinito per i nuovi socket, tuttavia se non si utilizzano direttamente le prese, l'impostazione può essere facilmente sovrascritta.

Per ulteriori informazioni, vedere this answer.

MODIFICA: Per quanto riguarda la domanda di follow-up, sì. Ho creato un programma che implicava il nome host alla conversione dell'indirizzo IP e ho riscontrato problemi con gli indirizzi mancanti. Non sono sicuro se questo fosse a causa di un timeout. Dovevo solo ricontrollare.

+0

Grazie. Mi chiedo solo, hai fatto qualcosa nel programma per risolvere il problema di indirizzo mancante o semplicemente ricontrollato manualmente? – saz

+0

Niente di intelligente o di fantasia. Ho appena avuto il ciclo del programma più di una volta e di solito ha funzionato bene. –

0

Ecco un esempio di utilizzo del segnale di allarme (per i sistemi di tipo POSIX) per impostare un timeout per socket.gethostbyname:

codice di installazione:

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 

codice Esecuzione

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")