.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的專欄