訪問ip 改為網域名稱 Asio DNS網域名稱解析

2021-10-12 01:35:25 字數 1893 閱讀 4695

網際網路應用是通過ip標識通訊雙方的主機位址的。常用的ipv4是32位的整數,而這個數字不好記憶,所以引入了更加適合人類閱讀和記憶的點分十進位制表示法,如環回位址對應「127.0.0.1「。即使這樣,本質上還是數字,仍然不利於溝通和記憶,試想以下,每次訪問**都要輸入這樣的位址,我們要記憶一大推這樣的無意義的數字,抑或是隨身帶著乙個筆記本,專門用來ip位址,這是多麼不方便。

為了解決上面的問題,引入了網域名稱(domain name)。網域名稱可以看作是乙個有意義的字串和ip列表的對映。在通訊過程中,先根據網域名稱找到ip位址,之後的通訊使用ip位址進行。將網域名稱解析為ip位址的過程,就是網域名稱解析。要實現網域名稱解析,需要還需要兩方面的支援:

對映存在何處

難不成每台電腦都儲存千千萬萬的對映?當然不是。這些對映儲存在dns(domain name system)。全世界部署著很多dns伺服器節點,每次網域名稱解析會根據規則請求這些dns節點得到對應的ip位址。

解析函式

通常每個作業系統都提供相應的介面用於網域名稱解析,如在linux下是gethostbyname函式,asio底層使用該函式進行網域名稱解析。

除了上面可讀性的差異外,網域名稱還提供了高可用的保障:乙個網域名稱可以對應多個ip位址,如果某個ip位址上的主機宕了,可以使用另外的ip進行通訊。而且,也利於系統的平滑公升級:若客戶端和服務端通過通訊,服務端公升級到新機器,只要網域名稱指向新機器,客戶端不需要做改動。

由於ipv6的逐漸流行,實際解析的位址可能既包含老的ipv4位址,又包含ipv6位址,這點需要注意。下面給出網域名稱解析的示例。

#include #include using namespace boost;int main()    // 列印ip位址  for (auto it = results.cbegin(); it != results.cend(); ++it)   return 0;}
上面的示例呼叫asio::ip::udp::resolverresolve方法,得到asio::ip::udp::resolver::results_type型別的結果。asio::ip::udp::resolver::results_type本質上是個迭代器,可以通過迭代器的操作遍歷。後面的迴圈列印每個endpoint。

這是程式呼叫的結果,包含ipv4和ipv6型別。

220.181.38.149:80

220.181.38.150:80

[240e:83:205:59:0:ff:b09b:159e]:80

[240e:83:205:58:0:ff:b09f:36bf]:80

上面的例子中有些型別是可以讓編譯器推斷出的,之所以寫出來是為了讓型別明確出來。下面的tcp解析示例會使用auto替代一些冗長的型別。

udp版本完全一致,我們唯一要做的就是將asio::ip::udp::resolver改為asio::ip::tcp::resolver型別。

nginx配置網域名稱訪問 禁止ip訪問

為什麼要禁止ip訪問?為了避免其他人把未備案的網域名稱解析到自己的伺服器ip,而導致伺服器被斷網,我們可以通過禁止使用ip訪問的方法,防止此類事情的發生。修改配置檔案nginx.conf,其中2.2的方法可以參考 這篇博文中的your project nginx.conf檔案配置,是一樣的道理。新加...

簡單Tomcat使用網域名稱訪問IP

上次軟工做了有登入註冊和簡單首頁展示的介面。因為來不及了,當時展示的時候就用ip 8080甚麼的展示了,這學期空閒時間比較多,順便稍微弄弄看。說不定以後會用到 一jdk,就是那些環境配置啥啥的 ps 同學說也可以用jvm 我沒有試過 三 在elipse專案上右鍵 export 再重啟tomcat就好...

Tomcat修改IP訪問為繫結網域名稱訪問

在專案中,我們可能會將我們的專案發布到網際網路,下面就是將tomcat ip訪問修改為網域名稱訪問 首先我們要修改tomcat的預設8080埠為80埠,tomcat home conf server.xml的修改方式如下 修改完以後,停掉tomcat,netstat an grep 80 檢視一下是...