2010-08-27 24 views
1

我正在使用getdomainname()和gethostbyname()嘗試獲取計算機的域名,以便我可以在我的程序中顯示正確的信息。但有時這些功能不會返回正確的信息。通過Linux中的代碼獲取域名

是否有任何其他方式(用普通的C)在Linux中獲取域名?

編輯:只是爲了更清楚一點:我想檢查電腦是否是域的一部分。如果是,請獲取域名。
目前我正在使用上面提到的功能。還有其他人嗎?

@unwind:請不要編輯這個問題的「簡潔」,如果我想說謝謝我會說謝謝。

謝謝!

+5

「但是,有時這些功能不會返回正確的信息。」你能更明確嗎? – FabienAndre 2010-08-27 13:10:33

+0

更明確:根本沒有任何信息,或者看起來不像域集。 – Jessica 2010-08-27 14:13:10

+0

你想要完成什麼? – Sjoerd 2010-08-27 14:20:34

回答

0

不幸的是這個信息並不總是正確。首先,向系統管理員投訴。

如果所有的失敗,與類似下面的你可能會得到一個場res->ai_canonname與正規主機名,然後同時遍歷所有IP地址:

struct addrinfo *res = NULL; 
struct addrinfo hints = { 
    .ai_family = AF_UNSPEC, 
    .ai_flags = AI_V4MAPPED | AI_ADDRCONFIG | AI_CANONNAME | (name ? 0 : AI_PASSIVE), 
    .ai_socktype = SOCK_STREAM, 
}; 
getaddrinfo(name, NULL, &hints, &res); 
for (struct addrinfo *p = res; p; p = p->ai_next) { 
... 
} 

你會然後以某種方式必須選擇哪些對你來說很有意思(避免回送等),並嘗試找到與其中一個IP地址相對應的主機名。但是,由於IP地址不一定對應於有效的主機名,這也可能會失敗。

+0

謝謝。 ai_canonname會給我主機的名字,和gethostname一樣的軟...至於第二部分,我不太明白。你想讓我得到所有的IP,然後每個都調用gethostname? – Jessica 2010-08-27 14:43:42

+0

@Jessica:不是'gethostname',沒有辦法指定IP地址。你必須要問解決方案。我沒有太多的經驗,但「人3解析器」應該告訴你你需要的接口。 – 2010-08-27 15:30:45

-2

爲了得到你所運行的程序的計算機的主機名:

  • uname
  • 的/ etc /主機名
+0

uname告訴你操作系統的名稱。/etc/hosts不保證其中包含更多的回送地址。 – JeremyP 2010-08-27 13:35:10

+0

linux實用程序'hostname'使用uname()來確定主機名。如果你做'uname -n',它會給出主機名。它是utsname結構中的'nodename'條目。 – Sjoerd 2010-08-27 13:58:40

+0

我正在使用gethostname來獲取主機名,然後我提供給gethostbyname。所以那已經在那裏了。 – Jessica 2010-08-27 14:14:56

1

如果您想獲取(互聯網)域名,您需要考慮某些問題。

一臺電腦可以有多個網絡接口,實際上它幾乎肯定至少有兩個包括loopback接口。每個接口都有一個IP地址(可能不止一個),每個IP地址可以映射到主機文件中的任意數量的DNS名稱和條目。

那麼,如果getdomainname()返回的許多可能的域名中有任何一個取決於整個配置問題。例如哪個IP地址配置爲主地址,主機文件是否優先於DNS使用,主機文件是否配置正確,IP地址是否具有反向查找集以及許多其他問題。

例如,錯誤配置主機文件相當常見。如果您看到如下條目:

192.168.1.1 foohost foohost.example.com 

這是錯誤的。 第一個一行上的主機名是規範名稱(用於接口),後續條目僅僅是別名。如果你想要域名出來作爲例子。COM,而不是什麼都沒有,它需要像這樣:

192.168.1.1 foohost.example.com foohost 

另外,互聯網上的每一個IP地址,最好有在DNS反向查詢記錄其IP地址映射到主機名和域名。但是,沒有規則說它存在,或者說它必須是您用SSH或在您的Web瀏覽器處指向的域。

在任何給定的計算機上,有很多原因導致域名不符合您的期望。