TCP IP中32位IP位址與字串轉化

2021-06-20 08:42:15 字數 1652 閱讀 3550

在網路上面我們用的ip都是數字加點(192.168.0.1)構成的, 而在struct in_addr結構中用的是32位的ip,我們上面那個32位ip(c0a80001)是的192.168.0.1 為了轉換我們可以使用下面兩個函式 

int inet_aton(const char *cp,struct in_addr *inp)

char *inet_ntoa(struct in_addr in)

函式裡面 a 代表 ascii n 代表network.第乙個函式表示將a.b.c.d的ip轉換為32位的ip,儲存在 inp指標裡面.第二個是將32位ip轉換為a.b.c.d的格式.

同樣inet_addr也可以進行字串到32位整形的轉換:

首先,假設你已經有了乙個sockaddr_in結構體ina,你有乙個ip位址"132.241.5.10" 要儲存在其中,你就要用到函式inet_addr(),將ip位址從 點數格式轉換成無符號長整型。使用方法如下:

ina.sin_addr.s_addr = inet_addr("132.241.5.10");

有的也使用unsigned long dst_ip = inet_addr("");

可見ipv4 套介面位址結構

struct in_addr

// 32bits ipv4 位址

//網路位元組順序 network byte order

類似:struct in_addr

; 這裡錯誤返回inaddr_none (實際上是-1,每位都是1)

而另乙個inaddr_any的值為0,意思是任何位址都可以。

注意,inet_addr()返回的位址已經是網路位元組格式,所以你無需再呼叫 函式htonl()。

我們現在發現上面的**片斷不是十分完整的,因為它沒有錯誤檢查。 顯而易見,當inet_addr()發生錯誤時返回-1。記住這些二進位制數字?(無符  號數)-1僅僅和ip位址255.255.255.255相符合!這可是廣播位址!大錯特 錯!記住要先進行錯誤檢查。

好了,現在你可以將ip位址轉換成長整型了。有沒有其相反的方法呢? 它可以將乙個in_addr結構體輸出成點數格式?這樣的話,你就要用到函式 inet_ntoa()("ntoa"的含義是"network to ascii"),就像這樣: 

printf("%s",inet_ntoa(ina.sin_addr));

它將輸出ip位址。需要注意的是inet_ntoa()將結構體in-addr作為一 個引數,不是長整形。同樣需要注意的是它返回的是乙個指向乙個字元的 指標。它是乙個由inet_ntoa()控制的靜態的固定的指標,所以每次呼叫 inet_ntoa(),它就將覆蓋上次呼叫時所得的ip位址。例如:

char *a1, *a2;..

a1 = inet_ntoa(ina1.sin_addr); /* 這是198.92.129.1 */

a2 = inet_ntoa(ina2.sin_addr); /* 這是132.241.5.10 */

printf("address 1: %s ",a1);

printf("address 2: %s ",a2);

輸出如下:

address 1: 132.241.5.10

address 2: 132.241.5.10

假如你需要儲存這個ip位址,使用strcopy()函式來指向你自己的字元指標。

ip位址與MAC位址 中的 組播

mac位址分成三類,分別是廣播位址 組播位址和單播位址。首先,ff ff ff ff ff ff毫無疑問是廣播位址。每個網絡卡出廠時被分配唯一乙個單播位址,頭24位是裝置製造廠商的編號,由ieee 電氣與電子工程師協會 分配,後24位是裝置廠商為網絡卡制定的唯一編號。例如08 00 20 0a 8c...

C WinCE開發中獲取MAC與IP位址

本人所使用的開發環境是vs2008,開發的系統所在移動終端版本為windows mobile 5.0。由於需要進行身份的驗證,需要獲取移動終端的mac位址,於是在網上進行搜尋,主要看到了三種方法來實現獲取mac位址,現記錄如下。第一種方法 使用managementclass 來獲取。殊不知,winc...

C 中如何得到主機名與IP位址

大學 檔名稱 getipandname 檔案標識 見配置 管理計畫書 檔案摘要 得到本地主機的名字與ip using system using system.net 當前版本 1.0 軟體 完成日期 2006年3月28日 取代版本 無 原作者 無 完成日期 無 namespace getipandn...