程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> Beej’s Guide Network to Programming 系列連載06

Beej’s Guide Network to Programming 系列連載06

編輯:關於C

.4. IP地址,後繼部分
       首先,我們已經使用structsockaddr_in ina, 比如,“10.12.110.57”或者“2001:db8:63b3:1::3490”那我們怎麼存儲他呢?我們使用inet_pton()轉換到結構中。(“pton”是presentation to network的簡稱。)

下面分別是基於IPv4和IPv6的代碼:

struct sockaddr_insa;         // IPv4

structsockaddr_in6 sa6;     // IPv6

 

inet_pton(AF_INET,“192.0.2.1”,&(sa.sin_addr));      // IPv4

inet_pton(AF_INET6,“2001:db8:63b3:1::3490”,&(sa6.sin6_addr));       // IPv6

       (注意:比較老的方式是使用inet_addr()或者inet_pton();但是他們不能工作在IPv6上)

       可是,上面的代碼不是魯棒的,因為沒有錯誤檢查。比如,inet_pton()返回-1表示錯誤;或返回0表示地址沒有。所以要檢查返回值。

       好,我們現在把IP地址字符串轉換到二進制的形式。反之呢?我們怎麼把struct in_addr 轉換為點數形式的IP呢?(或者轉化為冒號十六進制—Ipv6)在這裡,你可以用inet_ntop()這個函數(ntop意味著network to presentation),像下面這樣:

 \

 

當你調用它時,你可以判斷地址類型(IPv4或者IPv6),總是返回一個字符串指針,並且知道這個字符串的最大長度。(兩個宏是做這個事的:INET_ADDRSTRLEN和INET6_ADDRSTRLEN)

       (另外一個注意的轉換函數是inet_ntoa()。他也不能工作在IPv6上)

       最後,這些函數只能工作在數字IP地址上。

3.4.1. 私有網絡
       這些工作在放火牆後面的內部網絡相對於外部網絡要使用NAT(Network Address Translation)。

       你是不是有點緊張?“哪來的怪異的東西?”

       好了,這些事情我們都可以不考慮,他們由NAT處理。

       實際上,在家裡有一個防火牆。有2個已經分配的靜態IPv4地址,並且在網絡上有一些計算機。這怎麼可能?兩個計算機不能共享這些IP地址,而且我怎麼知道數據從哪到那!

       這個回答是:他們不能共享這些IP地址。他們分配的是私有網絡地址。

       部分內容省略…

       關於私有網絡地址的分配請參考RFC1918。

注C類地址中192.168.*.*是私有地址

 摘自 xiaobin_HLJ80的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved