【问题标题】:Can't resolve URL until program is restarted在程序重新启动之前无法解析 URL
【发布时间】:2016-02-25 14:28:03
【问题描述】:

我有一个基本上看起来像这样的 python 脚本:

#############################
# MAIN LOOP
while True:
        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        try:
            client_socket.connect((url, socketnum))
            packet = somedata
            client_socket.sendall(packet)

        except Exception as e:
            # an error occurred
            logging.error("An error occurred: {}".format(e))
            pass
        finally:
            logging.info("Closing socket...")
            client_socket.close()

    time.sleep(70)

我发现如果在计算机(嵌入式 Linux 系统)上建立互联网连接之前运行此脚本,自然,当套接字尝试连接时,我得到“Errno -3 名称解析临时失败” .但是,如果随后建立了 Internet 连接,程序仍然无法解析主机名 - 让它工作的唯一方法是重新启动 python 脚本。

由于这个系统不是我可以保证始终存在互联网连接的系统,是否有办法让 python 意识到互联网连接现在存在并且名称解析信息现在可用?

编辑: 一些进一步的测试表明,只有在启动后在机器上建立任何成功的互联网连接之前启动 python 程序时才会发生这种情况。如果python程序是在机器上之前建立了互联网连接之后启动的(即使它后来被断开了),程序会正常运行,并在互联网连接恢复后成功连接到互联网。

所以:

Bootup->Python 已启动->Internet 连接已建立 = 程序不工作

启动->Internet 连接已建立->Internet 已断开->Python 已启动 = 程序运行正常。

【问题讨论】:

    标签: python sockets python-3.x dns


    【解决方案1】:

    尝试在每次迭代中刷新 DNS 缓存。

    import os
    ... 
    while True:
        os.popen('nscd -I hosts',"r")
    ...
    

    或尝试使用service nscd restart 命令。

    【讨论】:

      最近更新 更多