【问题标题】:socket.getaddrinfo fails on one machine; works on another apparently-identical one. Why?socket.getaddrinfo 在一台机器上失败;适用于另一个明显相同的。为什么?
【发布时间】:2010-07-15 22:06:01
【问题描述】:

我有一台笔记本电脑和一台台式机,都运行 Ubuntu 10.04,都运行 Ubuntu 附带的 Python 2.6.5。

在笔记本电脑上,以下程序

#!/usr/bin/env python
import socket
print(socket.getaddrinfo("localhost", 8025, 0, socket.SOCK_STREAM))

有效——也就是说,它可以打印出一些内容而不会出错。

其实是这样的:

[(10, 1, 6, '', ('::1', 8025, 0, 0)), (2, 1, 6, '', ('127.0.0.1', 8025))]

(这是一堆 IPv6 数据和一堆 IPv4 数据。)

但是,在另一个盒子上,相同的程序会这样做:

Traceback (most recent call last):
  File "socktest.py", line 5, in <module>
    print(socket.getaddrinfo("localhost", 8025, 0, socket.SOCK_STREAM))
socket.gaierror: [Errno -2] Name or service not known

为什么?

笔记本电脑是 x86(即 32 位),而台式机是 x86_64,但如果这很重要,我会感到惊讶。笔记本电脑还有两个网络接口(无线和有线),而台式机只有有线;我再次怀疑这是否相关。根据“ifconfig”,所有三个接口都绑定到 IPv6 地址。我在两个盒子上比较了/etc/network,并没有发现任何区别,除了笔记本电脑有这个子句

# The primary network interface
auto eth0
iface eth0 inet dhcp

...这又一次让我觉得无关紧要。

::

如果你想要一些上下文:我的 Python 程序正在尝试发送电子邮件,而最终调用 getaddrinfo 的是电子邮件软件。

【问题讨论】:

  • “ping localhost”在两者上都能正常工作吗?
  • 要检查的其他文件:/etc/services/etc/resolv.conf
  • 我也有同样的问题:stackoverflow.com/q/32008965/936293。问题机器的 /etc/resolv.conf 的第一行是 192.168.80.254(家庭路由器),第二行是 ISP 的 DNS 服务器。 dig 表明对 192.168.80.254 的请求运行良好,但 getaddrinfo 不会。如果我交换 /etc/resolv.conf 中的两行,它可以工作,但在每次 DHCP 刷新时,它都会被重置。令人沮丧。有什么建议吗?

标签: python sockets networking


【解决方案1】:

勾选/etc/hosts 在它不起作用的方框上。是否有 localhost 的条目?
还要比较/etc/nsswitch.conf,看看是否有任何可疑之处,比如缺少“主机”行

【讨论】:

  • /etc/hosts 在两个框中都是相同的,除了空格和实际的主机名。每个都有两个“localhost”条目:一个用于 IPv4,一个用于 IPv6。 /etc/nsswitch.conf 在两个盒子上是相同的;每个都有一个“主机:”行。
  • 你能在两者上都做 telnet localhost 8025 吗?
猜你喜欢
  • 1970-01-01
  • 2019-11-20
  • 2011-02-24
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 2022-06-19
  • 1970-01-01
相关资源
最近更新 更多