【问题标题】:how to force python httplib library to use only A requests如何强制 python httplib 库仅使用 A 请求
【发布时间】:2009-10-08 22:01:50
【问题描述】:

问题是使用 httplib 的 urllib 正在查询 AAAA 记录。

我想避免这种情况。有什么好的方法吗?

>>> import socket
>>> socket.gethostbyname('www.python.org')
'82.94.164.162'


21:52:37.302028 IP 192.168.0.9.44992 > 192.168.0.1.53: 27463+ A? www.python.org. (32)
21:52:37.312031 IP 192.168.0.1.53 > 192.168.0.9.44992: 27463 1/0/0 A 82.94.164.162 (48)


 python /usr/lib/python2.6/urllib.py -t http://www.python.org >/dev/null 2>&1

 21:53:44.118314 IP 192.168.0.9.40669 > 192.168.0.1.53: 32354+ A? www.python.org. (32)
21:53:44.118647 IP 192.168.0.9.40669 > 192.168.0.1.53: 50414+ AAAA? www.python.org. (32)
21:53:44.122547 IP 192.168.0.1.53 > 192.168.0.9.40669: 32354 1/0/0 A 82.94.164.162 (48)
21:53:44.135215 IP 192.168.0.1.53 > 192.168.0.9.40669: 50414 1/0/0 AAAA[|domain]

【问题讨论】:

    标签: python dns ipv6 ipv4


    【解决方案1】:

    正确答案是:

    http://docs.python.org/library/socket.html

    Python 套接字库正在使用以下内容:

    socket.socket([family[, type[, proto]]]) 使用给定的地址族、套接字类型和协议号创建一个新套接字。地址族应该是 AF_INET(默认)、AF_INET6 或 AF_UNIX。套接字类型应该是 SOCK_STREAM(默认)、SOCK_DGRAM 或者可能是其他 SOCK_ 常量之一。协议号通常为零,在这种情况下可以省略。

    /* Supported address families. */
    #define AF_UNSPEC       0
    #define AF_INET         2       /* Internet IP Protocol         */
    #define AF_INET6        10      /* IP version 6                 */
    

    默认情况下它使用 0,如果你用 2 调用它,它将只查询 A 记录。

    请记住,在您的应用中缓存解析结果是一个非常糟糕的主意。永远不要这样做!

    【讨论】:

      【解决方案2】:

      看这里:how-do-i-resolve-an-srv-record-in-python

      一旦您解析了正确的 A ip,请在您的请求中使用它,而不是使用 dns。

      【讨论】:

      • 不是真的,这是一个坏习惯,例如,如果您有一个 TTL 60 秒的 A 记录,您必须在代码中尊重这一点,如果他们同时更改 IP 会发生什么?你的程序会失败,没有人知道为什么
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 2014-12-30
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多