在日常使用,我們更多的使用十進制字符串表示IP地址,比如192.169.130.66,而不是記憶32位的IP地址(關鍵是太長了記不住呀),使用字符串IP更為方便,可讀性也更好。
但是根據上述in_addr定義,網絡編程中需要的是網絡字節序表示的IP地址,因此需要有函數能相互轉換十進制字符串和網絡字節序整數表示的IP地址。
函數的頭文件以及定義如下:
#include
in_addr_t inet_addr( const char *string); /* 將字符串IP地址轉換為網絡字節序整數表示的IP地址 */
char *inet_ntoa( struct in_addr in); /* 將網絡字節序整數表示的IP地址轉換為字符串IP地址 */
如果IP地址合法,inet_addr函數可以成功轉換為對應網絡字節序;如果IP地址非法,那么inet_addr返回的值為INADDR_NONE(表示無效的結果)。
其中in_addr_t一般為32位的unsigned in,表示網絡字節序。
寫個程序測試下上述函數:
#include
#include // inet_addr
int main()
{
const char *string1 = "192.168.130.60";
const char *string2 = "192.168.130.256"; // 非法IP,范圍為0~255,
in_addr_t network_address1 = inet_addr(string1);
if (network_address1 == INADDR_NONE) {
printf("錯誤");
} else {
printf("網絡字節序為:%#x\n", network_address1);
}
in_addr_t network_address2 = inet_addr(string2);
if (network_address2 == INADDR_NONE) {
printf("錯誤");
} else {
printf("網絡字節序為:%#x\n", network_address2);
}
return 0;
}
在右側建立個c文件,測試上述轉換函數。