2009-10-08 54 views
2

問題是,使用httplib的urllib查詢AAAA記錄。如何強制python httplib庫僅使用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

Python的socket庫使用以下:

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記錄。

記住緩存resolv結果在你的應用程序是一個真正糟糕的想法。永遠不要做!

0

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

一旦你解決了正確的A IP,用它在你的要求,而不是DNS。

+0

不是真的,這是一個壞習慣,如果你有例如一個TTL爲60秒的A記錄,你必須尊重你的代碼,如果他們在此期間改變IP會發生什麼?你的程序將失敗,沒有人知道爲什麼 – Istvan 2009-10-09 22:38:04