如何强制python httplib库仅使用A请求

2 投票
2 回答
2837 浏览
提问于 2025-04-15 14:56

问题是,urllib这个库在使用httplib的时候,会去查询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]

2 个回答

0

看看这里: 如何在Python中解析SRV记录

一旦你找到了正确的A记录IP地址,就用这个IP地址来发送请求,而不是用DNS。

6

正确的答案是:

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

Python的socket库使用的是以下内容:

socket.socket([family[, type[, proto]]])

这个函数用来创建一个新的socket(套接字),需要提供一些参数,比如地址类型、socket类型和协议号。地址类型可以是AF_INET(默认值)、AF_INET6或者AF_UNIX。socket类型可以是SOCK_STREAM(默认值)、SOCK_DGRAM或者其他一些SOCK_常量。协议号通常是0,如果不提供这个参数,默认也是0。

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

默认情况下,它使用的是0,如果你传入2,它只会查询A记录。

记住,在你的应用中缓存解析结果是个非常糟糕的主意。绝对不要这样做!

撰写回答