我在 python 中使用 socket
的 gethostbyname()
将主机名转换为 IPv4 地址。有时显示 IP 地址只需要很少的额外时间。我想知道每次查找是否有任何默认超时值。这是我在我的程序中使用套接字的方式-
try:
addr = socket.gethostbyname(hostname)
except socket.gaierror:
addr = ""
print hostname+" : "+addr
只需要添加另一个问题,这是否有可能错过任何 IP 地址?任何人都有将大量主机名样本转换为 IP 地址的经验吗?
最佳答案
下面是一个使用警报信号(用于 posix 类型系统)为 socket.gethostbyname
设置超时的示例:
设置代码:
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
执行代码
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")
关于python - python 中的 socket.gethostbyname(hostname) 有超时值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27324494/