getaddrinfo()是一個函數,我們需要使用之前創建一個socket()或connect()ing,對吧?那麼getaddrinfo如何與DNS服務器進行通信?getaddrinfo()如何執行DNS查找?
PS:我在哪裏可以看到getaddrinfo的完整源代碼?
getaddrinfo()是一個函數,我們需要使用之前創建一個socket()或connect()ing,對吧?那麼getaddrinfo如何與DNS服務器進行通信?getaddrinfo()如何執行DNS查找?
PS:我在哪裏可以看到getaddrinfo的完整源代碼?
它使用DNS協議(UDP) http://www.freesoft.org/CIE/Topics/77.htm
False執行主機名到IP查找。見Steve Emmerson的回覆。 – bortzmeyer 2010-01-30 17:26:07
它不?你能證明這個嗎? – Zepplock 2010-02-02 06:21:21
您可以將您的nsswitch.conf更改爲僅依賴/ etc/hosts,而不執行任何dns查找。 – 2014-05-04 10:24:29
簡短的回答是「它要求系統」,這又知道怎麼做DNS查詢和服務器使用。
getaddrinfo()
由手冊頁getaddrinfo(3)
記錄,這意味着它是一個C庫函數。它也是一個POSIX函數,所以沒有規範的「源」;符合POSIX的操作系統的每個標準C庫都將實現它自己的版本。無論哪種方式,只有該函數的源代碼可能不是太有啓發性,因爲它只會調用其他函數和操作系統API,並且您必須深入瞭解實際的DNS機制。如果你對如何工作感興趣,你最好閱讀DNS協議本身的文檔。
這完全不正確。 UNIX操作系統沒有內置的DNS查找功能。這是在標準庫中的用戶空間中完成的。 http://code.metager.de/source/xref/eglibc/libc/sysdeps/posix/getaddrinfo.c – 2013-03-22 11:15:31
@HannesLandeholm我認爲這裏的細微差別在於,UNIX *內核*沒有內置的DNS查找功能,但更一般意義上的「系統」包括隨系統一起提供的用戶空間服務。 – mtraceur 2017-10-19 20:16:38
getaddrinfo()
可能確實在幕後調用了connect()
,但它已經知道它需要連接到的DNS服務器的IP地址,以便查詢您要求查詢的主機的地址。
getaddrinfo()
如果要地圖「www.somehost.com」的IP地址時,才需要,它是沒有必要的作爲底漆叫connect()
。
你也許可以找到在glibc的源getaddrinfo()
完整的源代碼,你可以在這裏找到(其他地方)。
希望能夠爲您澄清事物。
如果你想看看glibc如何命名查找,請從這裏開始:http://cvs.savannah.gnu.org/viewvc/libc/resolv/nss_dns/dns-host.c?revision=1.57&root=libc&view=markup(注意:它**複雜**)。 – caf 2010-01-28 23:32:36
這是沒有必要創建一個插座或連接之前調用getaddrinfo()
。它是用來像69.59.196.211將域名轉換,像stackoverflow.com,一個IP地址。如果你知道IP地址,那麼你可以直接連接到該地址,並且不需要使用getaddrinfo()
。 getaddrinfo()
使用DNS協議與您的名稱服務器交談,這些名稱服務器使用其IP地址進行配置。
glibc的源代碼是here。
你的Unix系統有文件/etc/nsswitch.conf嗎?如果是這樣,那麼「主機」條目給出了將主機名解析爲IP地址的搜索順序。你的系統有文件/etc/resolv.conf嗎?如果是這樣,那麼它指定要使用的DNS服務器。
正如你所看到的,getaddrinfo()將可以做相當多的(並且可能需要一段時間)!
對不起,如果這沒有多大意義..開始學習unix網絡編程只有幾天回來 - 我很困惑。 – n00b2000 2010-01-28 20:07:54
在創建套接字之前或在調用connect()之前,不需要調用getaddrinfo()。 – 2010-01-28 20:16:47
connect()需要被告知目標主機的IP地址。爲此,我們需要使用getaddrinfo() – 2015-02-24 08:12:49