gpt4 book ai didi

Python 套接字 GetAddrInfo (GAI) 错误

转载 作者:太空狗 更新时间:2023-10-29 11:15:30 27 4
gpt4 key购买 nike

我在嵌入式 linux 系统上运行 Python (2.7.2),启动顺序大致如下:

0) 重启

1)等待2分钟

2) 通过DHCP获取网络配置

守护进程使用 ntplib获取当前时间并相应地更新其时钟。

import ntplib  # http://pypi.python.org/pypi/ntplib/
...

self.ntpClient = ntplib.NTPClient()
...

def getDate(self):

try:
logging.info('Sending NTP request to %s' % ('pool.ntp.org'))
response = self.ntpClient.request('pool.ntp.org')
secs = time.localtime(response.tx_time)
logging.info('Response returned')
return secs

except Exception, e:
logging.exception(e)
return RESULT_FAILURE

如果守护进程在 dhcp 运行(第 2 步) 之前开始尝试解析地址信息,就会出现问题。即使 DHCP 客户端运行后,这仍然是一个错误。

异常(exception)情况:

ERROR:[Errno 2] temporary failure in name resolution.
Traceback (most recent call last):
File "/home/root/ntp_manager/ntp_manager.py", line 34, in getDate
response = self.ntpClient.request('pool.ntp.org')
File "/usr/lib/python2.7/ntplib.py", line 265, in request
addrinfo = socket.getaddrinfo(host, port)[0]
gaierror: [Errno 2] temporary failure in name resolution.

但是,如果 ntpClient 在 dhcp 之后进行它的第一次尝试,那么一切正常。

就好像错误是某种缓存的产物(?!)

我的想法已经用完了,非常感谢您的帮助。

谢谢

最佳答案

我已经制定了一个不需要任何其他库或脚本的解决方案。

/etc/network/if-up.d/ 目录中的脚本将在启动网络接口(interface)时执行。这是一个reference .

因此,这确保了一旦系统配置了 DHCP 客户端并连接到互联网,我的 NTP 脚本就会被执行。这是避免我遇到的名称解析问题的正确行为。

我将这个简单的脚本(和 chmod +x 它!)放在一起,它检查网络方法是否为 dhcp,并随后初始化我的 NTP 守护进程。

#! /bin/sh
# ntp time-sync manager python daemon starter script

set -e

# ... Some Stuff Omitted Here ...

if [ "$METHOD" = dhcp ]; then
echo -n "Starting $DESC..."
start-stop-daemon --start --verbose --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS
echo "METHOD: $METHOD"
echo "IFACE: $IFACE"
fi

echo "Exiting if-up.d/ntp_manager"
exit 0

这是系统上发生的事情的转储。请注意以下行:run-parts/etc/network/if-up.d 在 IP 解析后立即执行。

Reconfiguring network interfaces eth0 with DHCP... cat: can't open '/var/run/udh
cpc.eth0.pid': No such file or directory
run-parts /etc/network/if-pre-up.d
ifconfig eth0 up
udhcpc -R -b -p /var/run/udhcpc.eth0.pid -i eth0
udhcpc (v1.13.2) started
Sending discover...
Sending discover...
Sending select for 192.168.1.145...
Lease of 192.168.1.145 obtained, lease time 86400
adding dns 192.168.1.1
run-parts /etc/network/if-up.d
Starting NTP Time Manager...Daemon PID 1059
Redirecting serivice startup output to /home/root/Connect/log/ntp_manager_daemon.log
METHOD: dhcp
IFACE: eth0
Exiting if-up.d/ntp_manager

无论如何,我认为这是一个足够简单和可靠的问题解决方案。希望它将来对其他人有所帮助。

关于Python 套接字 GetAddrInfo (GAI) 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13318304/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com