2010-01-28 95 views
16

getaddrinfo()是一個函數,我們需要使用之前創建一個socket()或connect()ing,對吧?那麼getaddrinfo如何與DNS服務器進行通信?getaddrinfo()如何執行DNS查找?

PS:我在哪裏可以看到getaddrinfo的完整源代碼?

+0

對不起,如果這沒有多大意義..開始學習unix網絡編程只有幾天回來 - 我很困惑。 – n00b2000 2010-01-28 20:07:54

+0

在創建套接字之前或在調用connect()之前,不需要調用getaddrinfo()。 – 2010-01-28 20:16:47

+0

connect()需要被告知目標主機的IP地址。爲此,我們需要使用getaddrinfo() – 2015-02-24 08:12:49

回答

-1

它使用DNS協議(UDP) http://www.freesoft.org/CIE/Topics/77.htm

+1

False執行主機名到IP查找。見Steve Emmerson的回覆。 – bortzmeyer 2010-01-30 17:26:07

+0

它不?你能證明這個嗎? – Zepplock 2010-02-02 06:21:21

+0

您可以將您的nsswitch.conf更改爲僅依賴/ etc/hosts,而不執行任何dns查找。 – 2014-05-04 10:24:29

4

簡短的回答是「它要求系統」,這又知道怎麼做DNS查詢和服務器使用。

getaddrinfo()由手冊頁getaddrinfo(3)記錄,這意味着它是一個C庫函數。它也是一個POSIX函數,所以沒有規範的「源」;符合POSIX的操作系統的每個標準C庫都將實現它自己的版本。無論哪種方式,只有該函數的源代碼可能不是太有啓發性,因爲它只會調用其他函數和操作系統API,並且您必須深入瞭解實際的DNS機制。如果你對如何工作感興趣,你最好閱讀DNS協議本身的文檔。

+2

這完全不正確。 UNIX操作系統沒有內置的DNS查找功能。這是在標準庫中的用戶空間中完成的。 http://code.metager.de/source/xref/eglibc/libc/sysdeps/posix/getaddrinfo.c – 2013-03-22 11:15:31

+0

@HannesLandeholm我認爲這裏的細微差別在於,UNIX *內核*沒有內置的DNS查找功能,但更一般意義上的「系統」包括隨系統一起提供的用戶空間服務。 – mtraceur 2017-10-19 20:16:38

1

getaddrinfo()可能確實在幕後調用了connect(),但它已經知道它需要連接到的DNS服務器的IP地址,以便查詢您要求查詢的主機的地址。

getaddrinfo()如果要地圖「www.somehost.com」的IP地址時,才需要,它是沒有必要的作爲底漆叫connect()

你也許可以找到在glibc的源getaddrinfo()完整的源代碼,你可以在這裏找到(其他地方)。

希望能夠爲您澄清事物。

+2

如果你想看看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

10

這是沒有必要創建一個插座或連接之前調用getaddrinfo()。它是用來像69.59.196.211將域名轉換,像stackoverflow.com,一個IP地址。如果你知道IP地址,那麼你可以直接連接到該地址,並且不需要使用getaddrinfo()getaddrinfo()使用DNS協議與您的名稱服務器交談,這些名稱服務器使用其IP地址進行配置。

glibc的源代碼是here

+0

告訴我一件事,如果我想做反向DNS查詢,那麼哪個系統調用需要? – devsda 2013-03-01 09:15:00

+2

使用'getnameinfo()'進行地址到名稱反向DNS查詢。 – mark4o 2013-03-01 19:04:35

7

你的Unix系統有文件/etc/nsswitch.conf嗎?如果是這樣,那麼「主機」條目給出了將主機名解析爲IP地址的搜索順序。你的系統有文件/etc/resolv.conf嗎?如果是這樣,那麼它指定要使用的DNS服務器。

正如你所看到的,getaddrinfo()將可以做相當多的(並且可能需要一段時間)!