【问题标题】:python3: socket.gethostbyaddr(): "Unknown host" vs "Host name lookup failure"python3:socket.gethostbyaddr():“未知主机”与“主机名查找失败”
【发布时间】:2020-03-08 20:30:33
【问题描述】:

我在 python3 中使用socket.gethostbyaddr() 将 IP 解析为主机名。

我需要区分3种情况:

1) success (IP resolved to hostname)
2) IP address has no DNS record
3) DNS server is temporarily unavailable

我正在使用简单的功能:

def host_lookup(addr):
    try:
        return socket.gethostbyaddr(addr)[0]
    except socket.herror:
        return None

然后我想从我的主代码中调用这个函数:

res = host_lookup('45.82.153.76')

if "case 1":
    print('success')
else if "case 2":
    print('IP address has no DNS record')
else if "case 3":
    DNS server is temporarily unavailable
else:
    print('unknown error')

当我在 python 控制台中尝试socket.gethostbyaddr() 时,在每种情况下都会得到不同的错误代码:

>>> socket.gethostbyaddr('45.82.153.76')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
socket.herror: [Errno 1] Unknown host

当我故意让 DNS 无法访问时:

>>> socket.gethostbyaddr('45.82.153.76')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
socket.herror: [Errno 2] Host name lookup failure

那么如何在上面的代码中区分这些情况呢?

【问题讨论】:

    标签: python-3.x dns gethostbyaddr


    【解决方案1】:

    socket.herrorOSError 的子类,提供对数字错误代码errno 的访问:

    import socket
    
    def host_lookup(addr):
        return socket.gethostbyaddr(addr)[0]
    
    try:
        res = host_lookup("45.82.153.76")
        print('Success: {}'.format(res))
    except socket.herror as e:
        if e.errno == 1:
            print('IP address has no DNS record')
        elif e.errno == 2:
            print('DNS server is temporarily unavailable')
        else:
            print('Unknown error')
    

    【讨论】:

    • 使用import errno 和符号错误代码而不是数字错误代码。使代码更容易阅读,更安全。
    • @Patrick Mevzek - 你能举个例子吗,如何使用符号错误代码而不是数字错误代码?
    • import errno; print errno.ENOENT == 2 将显示True。有关可用变量的完整列表,请参阅 docs.python.org/3.7/library/errno.html 或等效项。
    • 但是,在这种情况下,错误编号不是标准的errno系统符号,而是h_errno的错误编号。最好自己声明它们:HOST_NOT_FOUND = 1; TRY_AGAIN = 2; NO_RECOVERY = 3; NO_DATA = 4; NO_ADDRESS = NO_DATA.
    猜你喜欢
    • 2016-08-07
    • 2021-11-14
    • 2019-11-09
    • 2023-04-10
    • 2021-03-06
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    相关资源
    最近更新 更多