как заставить библиотеку python httplib использовать только запросы A

Проблема в том, что 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]

person Istvan    schedule 08.10.2009    source источник


Ответы (2)


Правильный ответ:

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.

Помните, что кэширование результатов разрешения в вашем приложении — ДЕЙСТВИТЕЛЬНО ПЛОХАЯ ИДЕЯ. Никогда не делай этого!

person Istvan    schedule 09.10.2009

Посмотрите здесь: how-do-i-resolve-an-srv -запись-в-питоне

После того, как вы определили правильный IP-адрес A, используйте его в своем запросе вместо DNS.

person Amirshk    schedule 08.10.2009
comment
не совсем, это плохая привычка, если у вас есть, например, запись A с TTL 60 секунд, вы должны соблюдать это в своем коде, что произойдет, если они тем временем изменят IP? ваша программа потерпит неудачу, и никто не знает, почему - person Istvan; 10.10.2009