python - python 中的 socket.gethostbyname(hostname) 有超时值吗?

标签 python sockets

我在 python 中使用 socketgethostbyname() 将主机名转换为 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/

相关文章:

python - 如何在keras训练期间调用reset_states()?

python - 用 -infinity 填充 Numpy 数组的下三角形(包括对角线) - Python

Java Socket 命令行参数

sockets - 详解http保活机制

c - 读取套接字缓冲区未读取

python - 两个 Python 2.7 Mac OS X 磁盘镜像安装程序之间有什么区别?

python - xgboost 监视列表参数 : DMatrix object is not iterable

python - PyQt : Compiling date/time into window title

python - gsm网卡端口映射与python中的udp套接字

c - 为什么 UDP 组播服务器没有响应?