2009-10-08 6 views
2

Проблема в том, что urllib с использованием httplib запрашивает записи AAAA.Как заставить библиотеку httplib python использовать только запросы A

Я хотел бы избежать этого. Есть ли хороший способ сделать это?

>>> 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] 

ответ

6

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

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

Питон сокет библиотека использует следующий:

socket.socket ([семейство [, тип [, прото]]]) Создать новый сокет с использованием данного семейства адресов, типа сокета и номера протокола. Семейство адресов должно быть 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.

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

0

Посмотрите здесь: how-do-i-resolve-an-srv-record-in-python

После того, как вы решили исправить IP, использовать его в запросе, вместо того, чтобы СНД.

+0

На самом деле, это плохая привычка, если у вас есть, например, запись A с TTL 60 секунд, вы должны уважать то, что в вашем коде, что произойдет, если они изменят IP на время? ваша программа потерпит неудачу, и никто не знает, почему – Istvan