IP位址的三種表示格式及在開發中的應用

2021-08-22 01:52:11 字數 2433 閱讀 3879

使用tcp/ip協議進行網路應用開發的朋友首先要面對的就是對ip位址資訊的處理。ip位址其實有三種不同的表示格式,關於這一點,如果你還不知道,亦或對相關的知識還有所迷惑,本文對你將會有很大的幫助。

ip位址是ip網路中資料傳輸的依據,它標識了ip網路中的乙個連線,一台主機可以有多個ip位址,ip分組中的ip位址在網路傳輸中將保持不變。下面具體介紹ip位址的三種不同表示格式。

一、點分10進製表示格式

這是我們最常見的表示格式,比如某機的ip位址可能為「202.101.105.66」。事實上,對於ipv4(ip版本)來說,ip位址是由乙個32位的二進位制數所構成,但這樣一串數字序列無疑是十分冗長並且難以閱讀和記憶的。為了方便人們的記憶和使用,就將這串數字序列分成4組,每組8位,並改為用10進製數進行表示,最後用小原點隔開,於是就演變成了「點分10進製表示格式」。

來看看剛才那個ip位址的具體轉化過程:

分成4組後:11001010 01100101 01101001 01000010

十進位制表示:202 101 105 66

點分表示:202.101.105.66

二、網路位元組順序格式(nbo,network byte order)

下面我們來談談網路位元組順序格式,它和我們後面將要介紹的主機位元組順序格式一樣,都只在進行網路開發中才會遇到。因此,在下面的介紹中,我假設讀者對socket程式設計知識有一定的基礎。

在網路傳輸中,tcp/ip協議在儲存ip位址這個32位二進位制數時,協議規定採用在低位儲存位址中包含資料的高位位元組的儲存順序,這種順序格式就被稱為網路位元組順序格式。在實際網路傳輸時,資料按照每32位二進位制數為一組進行傳輸,由於儲存順序的影響,實際的位元組傳輸順序是由高位位元組到低位位元組的傳輸順序。

為了使通訊的雙方都能夠理解資料分組所攜帶的源位址、目的位址以及分組的長度等二進位制資訊,無論是主機還是路由器,在傳送每乙個分組以前,都必須將二進位制資訊轉換為tcp/ip標準的網路位元組順序格式。網路位元組順序格式的位址不受主機、路由器型別的影響,它的表示是唯一的。

在socket程式設計開發中,通過函式inet_addr和inet_ntoa可以實現點分字串與網路位元組順序格式ip位址之間的轉換。

inet_addr函式原型如下:

unsigned long inet_addr(const char far * cp)

函式中的引數cp指向網路中標準的點分位址字串,其中每個以點分開的數字不可以大於255,這些數字可以是十進位制、八進位制、十六進製制或者混合使用。如「10.23.2.3」、「012.003.002.024」、「0xa.0x3.0x14.0x2」、「10.003.2.0x12」。

下面舉乙個函式小例子,該函式可以用來測試一目標主機的某埠是否開放,這是埠掃瞄技術的基礎。

bool scanport(char * m_ip,u_short m_port)

三、主機位元組順序格式(hbo,host byte order)

主機位元組順序格式顧名思義,其ip位址的格式是和具體主機或者路由器相關的。對於不同的主機,在進行ip位址的儲存時有不同的格式,比如對於motorola 68k系列主機,其hbo與nbo是相同的。而對於intel x86系列,hbo與nbo則正好相反。

在socket程式設計中,有四個函式來完成主機位元組順序格式和網路位元組順序格式之間的轉換,它們是:htonl、htons、ntohl、和ntohs。htons和ntohs完成16位無符號數的相互轉換,htonl和ntohl完成32位無符號數的相互轉換。

在實際應用中我們常見到將埠號轉換的例子(如上例)。這是因為,如果使用者輸入乙個數字,而且將指定使用這一數字作為埠號,應用程式則必須在使用它建立位址以前,把它從主機位元組順序轉換成網路位元組順序(使用htons()函式),以遵守tcp/ip協議規定的儲存標準。相應地,如果應用程式希望顯示包含於某一位址中的埠號(例如從getpeername()函式中返回的),這一埠號就必須在被顯示前從網路順序轉換到主機順序(使用ntohs()函式)。

那麼,對於ip位址,主機位元組順序格式的轉換又有哪些應用呢?

應用一,如果想知道從202.156.2.23到202.156.9.65這兩個ip之間到底有多少個主機位址怎麼辦?這時就可以將兩個ip位址轉換為主機位元組順序的格式然後相減來得到,具體的實現如下:

int getipcount(char * ip1,char * ip2)

應用二,如果對乙個網段進行掃瞄,比如,當前正在掃瞄202.156.23.255,怎麼讓程式知道下乙個應掃的ip是202.156.24.0?這時可以將當前ip轉換成主機位元組順序格式並加1後,在轉換回網路格式即可,具體實現如下:

char * getnextip(char * m_curip)

總結

本文介紹了ip位址的三種不同表示格式,包括各種格式產生的原因、具體含義以及在socket程式設計開發中的一些應用。在實際應用中,必須遵循應用時所應採用的格式標準,同時還應靈活運用格式間的相互轉換以及計算技巧。通過對本文的閱讀,希望可以給讀者在以後的學習和工作開發帶來啟發。

IP位址的三種表示格式簡析

使用tcp ip協議進行網路應用開發的朋友首先要面對的就是對ip位址資訊的處理。ip位址其實有三種不同的表示格式,關於這一點,如果你還不知道,亦或對相關的知識還有所迷惑,本文對你將會有很大的幫助。ascii 網路點分字串 網路位址 32位無符號整形,網路位元組序,大頭 主機位址 主機位元組序 ip位...

if 的三種格式

if 語句 條件判斷 以及它的三種格式 public class main false 為假 所以不會執行裡面的語句if false 判斷 int a 1 int b 2 如果 a b 返回true 否則 返回 false a 1 b 2 aif a b aif a if 語句的三種格式 1.if ...

Linux檢視與修改IP位址的三種方式

首先是檢視當前機器網絡卡的ip 1.顯示當前啟動的網路介面命令 ifconfig 2.檢視當前所有網路介面命令 ifconfig a 3.檢視指定網路介面命令 ifconfig eth0 在linux下修改ip分為二種情況,1.除錯時修改ip,僅在當前生效,重啟後恢復為原有ip ifconfig e...